在 Scala 特征中预处理(需要)未初始化值的 属性

Preconditioning (require) an uninitialized value's property in a Scala trait

鉴于以下特征,实例 a 抛出 NullPointerException:

trait T {
  val l: List[Int]

  require(l.size > 1)
}

case class A(list: List[Int]) extends T {
  override val l: List[Int] = list
}

val a = A(List(1,2))

基于 this Whosebug post,我为 T 尝试了以下变体:

trait T {
  def l(): List[Int]

  require(l().size > 1)
}

trait T {
  val l: List[Int]
  lazy val s: Int = l.size

  require(s > 1)
}

trait T {
  val l: List[Int]
  def s: Int = l.size

  require(s > 1)
}

但他们都给出了NullPointerException

有没有办法为特征中的未初始化值 属性 使用前提条件(require 子句),或者我是否必须将前提条件复制到所有 类实施特征?

假设 ldef,解决该问题的一种方法如下:

case class A(list: List[Int]) extends {
    val l: List[Int] = list
} with T

您可以按照以下方式轻松完成此操作:

scala> :paste
// Entering paste mode (ctrl-D to finish)

trait T {
  def l: List[Int]
  require(l.size > 1)
}

case class A(l: List[Int]) extends T

val a = A(List(1,2))


// Exiting paste mode, now interpreting.

defined trait T
defined class A
a: A = A(List(1, 2))