Scala中的嵌套迭代

20

下面两个代码片段有什么区别(如果有的话)?

来自《Scala编程》第七章的例子。

def grep(pattern: String) = 
  for (
    file <- filesHere
    if file.getName.endsWith(".scala");
    line <- fileLines(file)
    if line.trim.matches(pattern)
  ) println(file + ": " + line.trim)

还有这个

def grep2(pattern: String) = 
  for (
    file <- filesHere
    if file.getName.endsWith(".scala")
  ) for (
    line <- fileLines(file)
    if line.trim.matches(pattern)
  ) println(file + ": " + line.trim)
或者
for (i <- 1 to 2)
  for (j <- 1 to 2)
    println(i, j)

for (
  i <- 1 to 2;
  j <- 1 to 2
) println(i, j)

2
我认为这些变体只是语法上的不同。Scala语言规范(v.2.8)的第6.19节定义了如何重写for循环。http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf#page=97 - mkneissl
搜索有关Scala和yield的问题。其中一个问题应该能够准确地解释Scala中的for如何工作。 - Daniel C. Sobral
2个回答

36
在这种情况下没有区别。然而,使用 yield 时会有所不同。
for (
  i <- 1 to 2;
  j <- 1 to 2
) yield (i, j)

这将会给你一个序列,其中包含(1,1)(1,2)(2,1)(2,2)

for (i <- 1 to 2)
  for (j <- 1 to 2)
    yield (i, j)

这不会给你任何东西,因为它在每次迭代中生成序列(i,1)(i,2),然后将其丢弃。


11

有时也有必要输出多维集合(例如表格的矩阵):

for (i <- 1 to 2) yield for (j <- 1 to 2) yield (i, j)

将返回:

Vector(Vector((1,1), (1,2)), Vector((2,1), (2,2)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接