Scala trait: val/def and require



以下代码抛出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在这一点上被定义?

因为def声明了一个方法,该方法由编译器放在类中,所以它一编译就存在。为了返回一些东西,一个方法必须一直运行到它实际返回一些东西的点,所以在第二个例子中没有问题。

val声明了一个"不可变值",尽管它仍然需要初始化,在此之前,它保持其类型的默认值——在本例中为0。这种初始化发生在trait T的构造函数运行之后,除非您将示例更改为使用早期初始化:

val y = new { val x = 42L } with T

最新更新