如何从子类型中的trait初始化值?

Mik*_*yer 7 scala traits

如果我写:

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设置特征中tfor 的值?uT

Den*_* R. 12

一种方法是u通过使用deflazy 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)

有关早期初始化的更多信息,请参见此处.