Scala中的嵌套迭代

时间:2010-09-03 10:33:04

标签: scala

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

Scala编程的Ch7示例

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 个答案:

答案 0 :(得分:31)

在这种情况下没有区别。但是当使用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),然后将其抛弃。

答案 1 :(得分:9)

有时输出多维集合(例如表格矩阵)也很有用:

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)))