Scala后期特性初始化

rbl8hiat  于 2023-01-30  发布在  Scala
关注(0)|答案(1)|浏览(138)

通常trait中的“memeber”被定义为def variable:Type,然后依赖于variable的其他memeber使用lazy val来防止variable在初始化时为空。
然而,如果它是一个逻辑块,例如一个依赖于variable的函数调用仍然会抛出null异常。

trait A {

    def variable:Seq[String]

    if (variable.size > 3) // check
      println("too many strings")

  }

  case class B(vs:String*) extends A {
    override val variable: Seq[String] = vs
    //override def hi(): Unit = ???
  }

  val b = B("x", "y", "z")
  println(b)

这将抛出错误“A.variable()为空”。
奇怪的是,如果我把变量写成给定的构造函数参数,错误就消失了。

case class B(override val variable:String*) extends A {
    //override def hi(): Unit = ???
  }

如何延迟“检查”以及为什么第二个case不抛出异常?

vhipe2zx

vhipe2zx1#

这是早期初始化器的用例

case class B(vs: String*) extends {
  override val variable: Seq[String] = vs
} with A {
  //override def hi(): Unit = ???
}

In Scala, what is an "early initializer"?
https://docs.scala-lang.org/scala3/reference/dropped-features/early-initializers.html

相关问题