以下代码抛出 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
关于Scala 特性 : val/def and require,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228108/