![](/img/trans.png)
[英]Scala - trait member initialization: use traits to modify class member
[英]Scala late trait initialization
通常 trait 中的“memeber”定義為def variable:Type
,然后其他依賴variable
的 memeber 使用lazy val
來防止variable
在初始化時為 null。
但是如果它是一段邏輯,例如 function 調用取決於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 class B(vs: String*) extends {
override val variable: Seq[String] = vs
} with A {
//override def hi(): Unit = ???
}
https://docs.scala-lang.org/scala3/reference/dropped-features/early-initializers.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.