Scala中的嵌套迭代

Wil*_*cat 18 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)
Run Code Online (Sandbox Code Playgroud)

还有这个

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)
Run Code Online (Sandbox Code Playgroud)

要么

for (i <- 1 to 2)
  for (j <- 1 to 2)
    println(i, j)
Run Code Online (Sandbox Code Playgroud)

for (
  i <- 1 to 2;
  j <- 1 to 2
) println(i, j)
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 32

在这种情况下,没有区别.但是当使用yield时,有:

for (
  i <- 1 to 2;
  j <- 1 to 2
) yield (i, j)
Run Code Online (Sandbox Code Playgroud)

会给你包含序列(1,1),(1,2),(2,1)(2,2).

for (i <- 1 to 2)
  for (j <- 1 to 2)
    yield (i, j)
Run Code Online (Sandbox Code Playgroud)

什么都不会给你,因为它会在每次迭代时生成序列(i,1),(i,2)然后将其抛弃.


Mis*_*hal 10

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

for (i <- 1 to 2) yield for (j <- 1 to 2) yield (i, j)
Run Code Online (Sandbox Code Playgroud)

将返回:

Vector(Vector((1,1), (1,2)), Vector((2,1), (2,2)))
Run Code Online (Sandbox Code Playgroud)