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

如果我写:

trait T {
  val t = 3
  val u = 1::t::Nil
}

class U extends T {
  override val t = 2
}

(new U).u

它显示了这一点.

List(1, 0)

我应该如何更改上面的代码,使其显示以下内容:

List(1, 2)

即覆盖val t为特征T中的u设置t的值?

一种方法是使用def或lazy val延迟对u的评估,如下所示:

trait T {
  def t = 3
  def u = 1::t::Nil
}

class U extends T {
  override def t = 2
}

(new U).u

要么

trait T {
  val t = 3
  lazy val u = 1::t::Nil
}

class U extends T {
  override val t = 2
}

(new U).u

差异如下:

> val在初始化期间进行表达式求值> def会在每次使用u时进行表达式计算> lazy val使其在首次使用时进行评估并缓存结果

相关文章
相关标签/搜索