2010-09-03 113 views
15

下面两个代码片段之间有什么区别(如果有的话)?从编程的Ch7的我的ScalaScala中的嵌套迭代

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节定义了如何重写循环。 http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf#page=97 – mkneissl 2010-09-03 11:06:21

+0

搜索有关Scala和收益率的问题。其中之一应该解释Scala中'for'的工作原理。 – 2010-09-03 18:40:42

回答

29

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

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)在每次迭代,然后它扔了出去。

6

有时它也是有用的输出一个多维集合(例如表矩阵):

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