2010-09-03 7 views
15

¿Cuál es la diferencia (si corresponde) entre dos fragmentos de código a continuación?iteración anidada en Scala

Ejemplo de Ch7 de Programación i 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) 

y éste

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) 

O

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

y

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

Creo que las variantes se diferencian únicamente por la sintaxis. La Sección 6.19 de la Especificación del Lenguaje de Scala (v. 2.8) define cómo se reescriben los bucles for. http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf#page=97 – mkneissl

+0

Preguntas sobre Scala y rendimiento. Uno de ellos debería explicar exactamente cómo funciona 'for' en Scala. –

Respuesta

29

En este caso, no hay diferencia. Sin embargo, cuando el rendimiento en que hay:

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

le dará una secuencia que contiene (1,1), (1,2), (2,1) y (2,2).

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

le dará nada, ya que genera la secuencia (i,1), (i,2) en cada iteración y lo tira.

6

A veces también es útil para dar salida a una colección de múltiples dimensiones (por ejemplo, una matriz de tabla):

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

Volverá:

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