目标
试图解密for comprehension and loop和他们的区别 .
Expr1 ::= `for' (`(' Enumerators `)' | `{' Enumerators `}')
{nl} [`yield'] Expr
Enumerators ::= Generator {semi Generator}
Generator ::= Pattern1 `<-' Expr {[semi] Guard | semi Pattern1 `=' Expr}
Guard ::= `if' PostfixExpr
问题
For loop
(enumsenums)的for循环ee为枚举器enumsenums生成的每个绑定执行表达式ee .
"Executes expression"意味着For循环不会产生一个值作为结果但只是对每个绑定应用一些操作,因此它基本上是 statement (在我的理解中,在Scala中,表达式返回一个值,但是一个语句没有)?
例如,下面将不会产生任何结果 .
val mnemonic = Map('2' -> "ABC", '3' -> "DEF")
val a = for ((digit, str) <- mnemonic) str.contains(digit)
For comprehension
A用于理解(enumsenums)yield ee为枚举器enumsenums生成的每个绑定计算表达式ee并收集结果 .
而对于理解,将通过收集评估每个绑定的 Expr 表达式的结果来生成集合对象 . 如果是这样,集合的类型是什么?如果它是一个方法,我可以查看API文档,但哪个文档指定For comprehension返回的类型?
2 回答
for循环为集合中的每个项执行语句:
将打印数字1,2和3.循环的返回类型是
Unit
,有点像void
将是Java,因此将它分配给任何东西是没有意义的 .对于理解,使用关键字
yield
,只是map
或flatmap
的语法糖 . 这两个陈述是等价的:因为Scala中的理解是
map
,flatMap
和filter
的语法糖 . 他们返回的类型取决于您在理解中使用的集合类型,因此: