給定以下代碼示例
case class Thing(
value: String,
parents: Seq[Thing],
children: Seq[Thing],
)
val x = Thing(
value = "foo",
parents = Seq(y),
children = Seq(),
)
val y = Thing(
value = "bar",
parents = Seq(x),
children = Seq(),
)
因為在創建 x 時 y 未初始化而出錯,是否有任何方法可以在不使用輔助資料結構(例如哈希映射)手動創建指向每個物件的指標的情況下執行這種“回圈參考”?
uj5u.com熱心網友回復:
修復編譯代碼和運行時例外的一種方法是:
class Thing(
_value: => String,
_parents: => Seq[Thing],
_children: => Seq[Thing]
) {
lazy val value = _value
lazy val parents = _parents
lazy val children = _children
}
object Thing {
def apply(
value: => String,
parents: => Seq[Thing],
children: => Seq[Thing]
): Thing = {
new Thing(value, parents, children)
}
}
val x: Thing = Thing(
value = "foo",
parents = Seq(y),
children = Seq()
)
val y: Thing = Thing(
value = "bar",
parents = Seq(x),
children = Seq()
)
類中使用的欄位 Thing必須延遲評估,但由于 Scala禁止對公共類引數使用按名稱呼叫,我將它們存盤在私有類引數中,并通過 public 使它們可公開訪問lazy val。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/453082.html
標籤:斯卡拉
上一篇:列印出TableQuery[Restaurants]中的所有資料
下一篇:避免在測驗檔案中實體化物件
