Scala特质: val/def和require

4
下面的代码会抛出 IllegalArgumentException 异常:
trait T{
  val x: Long
  require(x > 0)
}

object T extends App{
  val y = new T{ val x = 42L }
}

以下内容不符合要求:
trait T{
  def x(): Long
  require(x() > 0)
}

object T extends App{
  val y = new T{ def x() = 42L }
}

为什么会这样?require() 何时被调用?为什么在那一点上 val 被定义了?
1个回答

7
因为def声明了一个方法,编译器将其放入类中,所以它在编译后就存在了。为了返回一些东西,方法必须运行到实际返回内容的那个点,所以你的第二个例子没有问题。 val声明了一个“不可变值”,尽管在初始化之前,它仍然需要被初始化,并且保持其类型的默认值-在这种情况下是0。除非你改变你的示例来使用早期初始化,否则这个初始化将在trait T的构造函数运行之后进行。
val y = new { val x = 42L } with T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接