Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nested iteration in Scala

Tags:

scala

What is the difference (if any) between two code fragments below?

Example from Ch7 of Programming 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)

and this one

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)

Or

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

and

for (
  i <- 1 to 2;
  j <- 1 to 2
) println(i, j)
like image 867
Wildcat Avatar asked Sep 03 '10 10:09

Wildcat


2 Answers

In this case there is no difference. However when using yield there is:

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

Will give you a sequence containing (1,1), (1,2), (2,1) and (2,2).

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

Will give you nothing, because it generates the sequence (i,1), (i,2) on each iteration and then throws it away.

like image 140
sepp2k Avatar answered Sep 24 '22 00:09

sepp2k


Sometimes it is also useful to output a multi dimensional collection (for example a matrix of table):

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

Will return:

Vector(Vector((1,1), (1,2)), Vector((2,1), (2,2)))
like image 28
Mishael Rosenthal Avatar answered Sep 24 '22 00:09

Mishael Rosenthal