繁体   English   中英

Scala用于理解和循环

[英]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理解只是mapflatmap语法糖。 这两个语句是等效的:

val y1 = for (x <- List(1,2,3)) yield x+1
val y2 = List(1,2,3).map(x => x+1)

对于Scala的理解,需要使用mapflatMapfilter语法糖。 它们返回的类型取决于您在理解中使用的集合类型,因此:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM