你的代码可以翻译成这样:
def compute2(maybeFoo: Option[Foo]): Option[Int] =
for {
foo <- maybeFoo
bar <- foo.bar
baz <- bar.baz
} yield baz.compute
引用Programming in Scala, Second Edition:
通常,for 表达式的格式为:
for ( seq ) yield expr
这里,seq 是生成器、定义和过滤器的序列,连续元素之间用分号隔开。
这个 for 表达式包含一个生成器、一个定义和一个过滤器:
for {
p <- persons // a generator
n = p.name // a definition
if (n startsWith "To") // a filter
} yield n
用一个生成器翻译表达式
首先,假设你有一个简单的 for 表达式:
for (x <- expr1) yield expr2
其中 x 是一个变量。这样的表达式被翻译成:
expr1.map(x => expr2)
翻译以生成器和过滤器开头的表达式
现在,考虑将前导生成器与一些
其他元素。 A for 的表达形式:
for (x <- expr1 if expr2) yield expr3
翻译成:
expr1 withFilter (x => expr2) map (x => expr3)
翻译以两个生成器开头的表达式
以两个生成器开头的表达式的下一个 case 句柄,如下所示:
for (x <- expr1; y <- expr2) yield expr3
上面的for表达式被翻译成flatMap的一个应用:
expr1.flatMap(x => for (y <- expr2) yield expr3)