2010-09-03 22 views
15

Aşağıdaki iki kod parçası arasındaki fark nedir (varsa)?Scala'da iç içe yineleme

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) 

Programlama CH7 Örnek ve bu

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) 

ya

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

ve

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

Ben varyantları yalnızca sözdizimi farklılık düşünüyorum. Scala Dil Özelliğinin Bölüm 6.19'u (s. 2.8), döngülerin nasıl yeniden yazılacağını tanımlar. http://www.scala-lang.org/sites/default/files/linuxsoft_archives/docu/files/ScalaReference.pdf#page=97 – mkneissl

+0

Scala ve verimle ilgili soruları arayın. Bunlardan biri Scala'da tam olarak nasıl çalıştığını açıklamalıdır. –

cevap

29

Bu durumda bir fark yoktur. verim kullanırken Ancak orada:

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

size (1,1), (1,2), (2,1) ve (2,2) içeren bir diziyi verecek.

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

o diziyi (i,1), her tekrarında (i,2) üretir, çünkü size hiçbir şey vermek ve sonra geri atar mısın.

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

döndürür::

6

Bazen çok boyutlu toplama (örneğin tablo için bir matris) ayrıca çıkışa yararlıdır

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