2
我想要創建一個列表Chicken
s和Egg
。他們被定義爲:是否可以在for表達式中使用lazy值?
class Chicken (val name: String, e: => Egg) { lazy val child = e }
class Egg (val name: String, c: => Chicken) { lazy val parent = c }
和一對必須實例懶惰,因爲它們包含循環引用:
def fillBarn {
lazy val chicken: Chicken = new Chicken("abc", egg)
lazy val egg: Egg = new Egg("def", chicken)
}
我有,我想創建雞/雞蛋名稱的列表。不幸的是,以下不會編譯:
val names = List("C1 E1", "C2 E2", "C3 E3")
val list = for {
Array(cn, en) <- names.map(_.split(" "))
lazy c: Chicken = new Chicken(cn, e)
lazy e: Egg = new Egg(en, c)
} yield (c, e)
但沒有糖它:
val list = names.map(_.split(" ")).map {
case Array(cn, en) =>
lazy val c: Chicken = new Chicken(cn, e)
lazy val e: Egg = new Egg(en, c)
(c, e)
}
現在可以說是在這個簡單的情況下,它更好,而不用於表達,可是如果我不希望使用for-expression,可以嗎?
我也認識到,在這個簡單例子,我可以一個yield
塊內構建Chicken
和Egg
的情況下,但是這通常不會是真實的,說,如果我想要做的基於實例一些額外的過濾和映射。
太棒了!非常感謝。我認爲內聯模式是我正在尋找的(這裏的fillBarn方法只是表明它們需要延遲實例化,但有時單獨的工廠方法肯定會適用)。 –