尝试解密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。
“执行表达式”意味着For循环不会产生值作为结果,只是对每个绑定应用一些操作,因此它基本上是 语句 (在我的理解,在Scala中,表达式返回一个值,但是一个语句不返回??
例如,下面将不会产生任何结果。
val mnemonic = Map('2' -> "ABC", '3' -> "DEF")
val a = for ((digit, str) <- mnemonic) str.contains(digit)
理解
为了理解(enumsenums),ee为枚举器枚举生成的每个绑定计算表达式ee并收集结果。
而对于理解,将通过收集评估每个绑定的 Expr 表达式的结果来生成集合对象。如果是这样,集合的类型是什么?如果它是一个方法,我可以查看API文档但是哪个文档指定了For comprehension返回的类型?
答案 0 :(得分:2)
for循环为集合中的每个项执行语句:
for (x <- List(1,2,3)) {
println(x)
}
将打印数字1,2和3.循环的返回类型是Unit
,有点像void
将是Java,所以它没有意义将它分配给任何东西。
使用关键字yield
进行理解只是map
或flatmap
的语法糖。这两个陈述是等价的:
val y1 = for (x <- List(1,2,3)) yield x+1
val y2 = List(1,2,3).map(x => x+1)
答案 1 :(得分:1)
对于Scala中的理解,map
,flatMap
和filter
的语法糖。它们返回的类型取决于您在理解中使用的集合类型,因此:
val result1: List[Int] = for (x <- List(1,2,3)) yield x
val result2: String = for (x <- "string") yield x
val result3: Future[Unit] = for (x <- futureReturningFunction()) yield x