2010-09-03 6 views
15

В чем разница (если есть) между двумя фрагментами кода ниже?Вложенная итерация в Scala

Пример из ch7 программирования я 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) 

и этот

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

Я думаю, что варианты отличаются только синтаксисом. Раздел 6.19 Спецификации языка Scala (версия 2.8) определяет, как переписывать петли. http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf#page=97 – mkneissl

+0

Поиск вопросов о Scala и урожайности. Один из них должен точно объяснить, как 'for' работает в Scala. –

ответ

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))) 
Смежные вопросы