代码之家  ›  专栏  ›  技术社区  ›  Wildcat

Scala中的嵌套迭代

  •  17
  • Wildcat  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  34
  •   sepp2k    14 年前

    在这种情况下没有区别。然而,当使用产量时,有:

    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) 每次迭代,然后将其丢弃。

        2
  •  10
  •   Mishael Rosenthal    10 年前

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

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