引用Scala构造函数args的默认值

时间:2014-02-02 09:19:18

标签: scala constructor arguments

在下面的Scala代码中,当我尝试新建not found: value x的默认值时,编译器告诉我y,引用x,另一个构造函数参数。

class Foo(x: String, y: Bar = new Bar(x))

class Bar(a: String)

我相信这种限制是有充分理由的。任何人都可以解释一下并可能提供另一种方法吗?

2 个答案:

答案 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))