在下面的Scala代码中,当我尝试新建not found: value x
的默认值时,编译器告诉我y
,引用x
,另一个构造函数参数。
class Foo(x: String, y: Bar = new Bar(x))
class Bar(a: String)
我相信这种限制是有充分理由的。任何人都可以解释一下并可能提供另一种方法吗?
答案 0 :(得分:3)
作为替代方法:
class Foo(x: String, y: Bar)
class Bar(a: String)
object Foo {
def apply(x: String) = new Foo(x, new Bar(x))
}
另一个:
class Foo(x: String, y: Bar) {
def this(x: String) = this(x, new Bar(x))
}
答案 1 :(得分:2)
您正在定义一个有两个成员的类:
class Foo(x: String, y: Bar)
但是,当您将y
绑定到特定实例时,有效地将类定义简化为:
class Foo(x: String) { private val y = new Bar(x) }
为什么呢?由于您将y
绑定到Bar(x)
个实例,因此在不更改y
的情况下,任何人都无法更改x
。
现在,如果您注意到编译器在说not found: value x
时是正确的,因为x
作为实例仅在构造函数体中可见。 y
也是如此。这意味着在实际调用构造函数并实现new Bar(x)
和x
参数之前,将调用以下代码中的y
:
class Foo(x: String, y: Bar = new Bar(x))