以下Scala代码不能在Scala REPL 2.11.6中编译:
object Foo {
val DefaultSize: Int = 10
}
class Foo(size: Int = Foo.DefaultSize)编译错误为:
value DefaultSize is not a member of object Foo
class Foo(size: Int = Foo.DefaultSize)使用Scala 2.11进行了测试。这特别奇怪,因为它完全遵循公认的答案(在2012年):Use method return value as default constructor parameter in Scala,它现在也不编译。那么,如何实现预期的行为呢?
发布于 2017-07-13 13:51:16
作为explained in Programming in Scala,这是因为Scala REPL为您键入的每个新语句创建了一个新的嵌套作用域。这意味着您的代码被解释为:
object Foo {
val DefaultSize: Int = 10
}
{
class Foo(size: Int = Foo.DefaultSize)
}虽然the same book mentions认为类和它的伴生对象必须在同一个源文件中定义,但似乎它们还必须在同一个作用域中,因为does not compile with scalac上面的代码块。
我知道在REPL中有两种方法可以解决这个问题。正如其他人所提到的,您可以在定义类和伴生对象之前进入:paste模式。或者,您可以将它们放入相同的作用域中,例如,通过在对象中定义它们:
object My {
object Foo {
val DefaultSize: Int = 10
}
case class Foo(size: Int = Foo.DefaultSize)
}现在,您可以按预期使用Foo:
scala> new My.Foo()
res0: My.Foo = Foo(10)
scala> new My.Foo(20)
res1: My.Foo = Foo(20)(为了在最后一个代码块中获得简明的class Foo结果,我将case class设为一个REPL。然而,答案在没有这种改变的情况下是有效的。)
https://stackoverflow.com/questions/45060596
复制相似问题