通常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不抛出异常?
1条答案
按热度按时间vhipe2zx1#
这是早期初始化器的用例
In Scala, what is an "early initializer"?
https://docs.scala-lang.org/scala3/reference/dropped-features/early-initializers.html