簡體   English   中英

Scala 延遲特征初始化

[英]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 = ???
}

在 Scala 中,什么是“早期初始化器”?

https://docs.scala-lang.org/scala3/reference/dropped-features/early-initializers.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM