Scala特征:val / def和require

时间:2013-11-26 21:14:47

标签: scala illegalargumentexception

以下代码抛出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 个答案:

答案 0 :(得分:6)

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

val声明一个“不可变值”,虽然它仍然需要初始化,在此之前它保持其类型的默认值 - 在本例中为0.此初始化发生在{的构造函数之后运行{1}},除非您将示例更改为使用早期初始化:

trait T