2013-11-26 65 views
2

下面的代码抛出IllegalArgumentException斯卡拉特点:VAL/DEF和要求

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甚至在那个时候定义?

回答

6

由于def声明了一个方法,该方法由编译器放入类中,因此只要编译它就会存在。为了返回一些东西,一个方法必须跑到它实际返回的地方,所以在你的第二个例子中没有问题。

val声明了一个“不变的价值”,尽管它仍然必须被初始化之前,而此时它拥有其类型的默认值 - 在这种情况下,0。这个初始化发生trait T运行的构造后,除非你改变你的例子以尽早使用初始化:

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