La sintassi del for loop è:
for (<identifier> <- <iterator>) [yield] [<expression>]
Si noti che yield è opzionale, e serve per produrre un iterabile che possiamo assegnare ad un valore.
Per esempio:
for (x <- 1 to 10) { println(s"Elemento $x") }
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7 Elemento 8 Elemento 9 Elemento 10
In questo modo ad ogni iterazione stampo la stringa “Elemento x”.
Se invece vogliamo ottenere un iterabile che contenga le stringhe “Elemento x”, da usare in un secondo tempo, posso usare yield
for (x <- 1 to 7) yield { s"Elemento $x" }
res8: scala.collection.immutable.IndexedSeq[String] = Vector(Elemento 1, Elemento 2, Elemento 3, Elemento 4, Elemento 5, Elemento 6, Elemento 7)
il risultato è un vettore di stringhe, che è un sotto-tipo di un immutable.IndexedSeq
Naturalmente per riutilizzare questo vettore devo assegnarlo ad un valore:
val vec = for (x <- 1 to 7) yield { s"Elemento $x" }
vec: scala.collection.immutable.IndexedSeq[String] = Vector(Elemento 1, Elemento 2, Elemento 3, Elemento 4, Elemento 5, Elemento 6, Elemento 7)
Adesso posso iterare su questo vettore
vec.foreach(println)
Elemento 1 Elemento 2 Elemento 3 Elemento 4 Elemento 5 Elemento 6 Elemento 7
In questo modo abbiamo mappato i numeri da 1 a 10 in stringhe corrispondenti, ottenendo un iterabile che può essere usato in un altro for loop.