目标
尝试解密for循环和for推导式以及它们之间的区别。
Expr1 ::= `for' (`(' Enumerators `)' | `{' Enumerators `}')
{nl} [`yield'] Expr
Enumerators ::= Generator {semi Generator}
Generator ::= Pattern1 `<-' Expr {[semi] Guard | semi Pattern1 `=' Expr}
Guard ::= `if' PostfixExpr
问题
For循环
枚举值enumsenums生成的每个绑定上,for循环会执行表达式ee。
"执行表达式"意味着for循环不会返回一个结果值,而仅仅是对每个绑定应用一些操作,因此它基本上是一个语句(在我看来,在Scala中,表达式返回一个值,但语句不返回值)?
例如,下面的内容将不会产生任何结果。
val mnemonic = Map('2' -> "ABC", '3' -> "DEF")
val a = for ((digit, str) <- mnemonic) str.contains(digit)
为理解
对于枚举(enums)的for comprehension会生成绑定,评估表达式ee并收集结果。
而For Comprehension将通过收集每个绑定的Expr表达式的评估结果来生成一个集合对象作为结果。那么,创建的集合类型是什么?如果它是一个方法,我可以查看API文档,但是哪个文档指定了For comprehension返回的类型?
flatMap
就会被替换为foreach
,而循环体则放在最后一个lambda中。例如:for(x <- List(1,2,3); y <- List(2,3,4)) println(x + y)
desugared 为List(1, 2, 3).foreach(x => List(2, 3, 4).foreach(y => print(x, y)))
- Łukasz