如果我写:
trait T {
val t = 3
val u = 1::t::Nil
}
class U extends T {
override val t = 2
}
(new U).u
Run Code Online (Sandbox Code Playgroud)
它显示了这一点.
List(1, 0)
Run Code Online (Sandbox Code Playgroud)
我应该如何更改上面的代码,使其显示以下内容:
List(1, 2)
Run Code Online (Sandbox Code Playgroud)
即override val t
设置特征中t
for 的值?u
T
Den*_* R. 12
一种方法是u
通过使用def
或lazy val
如下延迟评估:
trait T {
def t = 3
def u = 1::t::Nil
}
class U extends T {
override def t = 2
}
(new U).u
Run Code Online (Sandbox Code Playgroud)
要么
trait T {
val t = 3
lazy val u = 1::t::Nil
}
class U extends T {
override val t = 2
}
(new U).u
Run Code Online (Sandbox Code Playgroud)
差异如下:
val
在初始化期间进行表达式求值def
使表达式评估每个时间u
用于lazy val
使其在首次u
使用时进行评估并缓存结果Ste*_*man 10
尝试使用早期初始化程序:
scala> trait T {
| val t = 3
| val u = 1::t::Nil
| }
defined trait T
scala> class U extends {
| override val t = 2;
| } with T
defined class U
scala> (new U).u
res1: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
有关早期初始化的更多信息,请参见此处.