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方法只是表明它们需要延迟实例化,但有时单独的工厂方法肯定会适用)。 –