[英]Scala For Comprehensions and For Loops
试图解密的理解和循环及其区别。
Expr1 ::= `for' (`(' Enumerators `)' | `{' Enumerators `}')
{nl} [`yield'] Expr
Enumerators ::= Generator {semi Generator}
Generator ::= Pattern1 `<-' Expr {[semi] Guard | semi Pattern1 `=' Expr}
Guard ::= `if' PostfixExpr
对于循环
for(enumsenums)ee的for循环针对由枚举器枚举生成的每个绑定执行表达式ee。
“执行表达式”意味着For Loop不会生成结果值,而只是对每个绑定应用一些操作,因此它基本上是一条语句 (据我所知,在Scala中,表达式返回一个值,但一条语句不返回) ?
例如,在下面将不会产生任何结果。
val mnemonic = Map('2' -> "ABC", '3' -> "DEF")
val a = for ((digit, str) <- mnemonic) str.contains(digit)
为了理解
对于(enumsenums)产量ee的for理解,将对由枚举者枚举生成的每个绑定评估表达式ee并收集结果。
而For Comprehension将通过收集对每个绑定的Expr表达式求值的结果来生成一个收集对象。 如果是这样,货箱的类型是什么? 如果这是一种方法,我可以查看API文档,但是哪个文档指定了For comprehension返回的类型?
for循环为集合中的每个项目执行一条语句:
for (x <- List(1,2,3)) {
println(x)
}
将打印数字1、2和3。循环的返回类型为Unit
,这有点像Java中的void
,因此将其分配给任何对象都没有意义。
使用关键字yield
a理解只是map
或flatmap
语法糖。 这两个语句是等效的:
val y1 = for (x <- List(1,2,3)) yield x+1
val y2 = List(1,2,3).map(x => x+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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.