首页 文章

Scala For Comprehensions和For循环

提问于
浏览
2

目标

试图解密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 回答

  • 2

    for循环为集合中的每个项执行语句:

    for (x <- List(1,2,3)) {
      println(x)
    }
    

    将打印数字1,2和3.循环的返回类型是 Unit ,有点像 void 将是Java,因此将它分配给任何东西是没有意义的 .

    对于理解,使用关键字 yield ,只是 mapflatmap 的语法糖 . 这两个陈述是等价的:

    val y1 = for (x <- List(1,2,3)) yield x+1
    val y2 = List(1,2,3).map(x => x+1)
    
  • 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
    

相关问题