Scala 是否可以在for表达式中使用惰性值?

Scala 是否可以在for表达式中使用惰性值?,scala,lazy-evaluation,Scala,Lazy Evaluation,我有一份我想做的鸡和蛋的清单。它们的定义如下: 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

我有一份我想做的鸡和蛋的清单。它们的定义如下:

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)
现在可以说,在这个简单的例子中,没有for表达式更好,但是如果我真的想使用for表达式,可以吗


我还意识到,在这个简单的例子中,我可以在一个产量块中构造鸡和蛋的实例,但这通常不会是真的,比如说,如果我想基于实例进行一些额外的过滤和映射。

那么,在这个例子中,也可以说在更高级的例子中,您可以随时调整fillBarn方法,以提供您所需的内容,这是理解此方法的唯一方法:

def fillBarn(c: String, e: String) = {
  lazy val chicken: Chicken = new Chicken(c, egg)
  lazy val egg: Egg = new Egg(e, chicken)
  (chicken, egg)
}
然后

val list = for {
  Array(cn, en) <- names.map(_.split(" "))
  (c, e) = fillBarn(cn, en)
} yield (c, e)

Scala中for语句的一般结构是固定的。只有平面图/地图/foreach具有伟大的特性!非常感谢。我认为我正在寻找的是内联模式,这里的fillBarn方法只是表明它们需要延迟实例化,但是有时使用单独的工厂方法肯定是合适的。
val list = for {
  Array(cn, en) <- names.map(_.split(" "))
  (c, e) = fillBarn(cn, en)
} yield (c, e)
val list = for {
  Array(cn, en) <- names.map(_.split(" "))
  (c, e) = {
    lazy val chicken: Chicken = new Chicken(cn, egg)
    lazy val egg: Egg = new Egg(en, chicken)
    (chicken, egg)
  }
} yield (c, e)