Uma coisa interessante que constatei ao utilizar a função map de Range
(
http://www.scala-lang.org/docu/files/api/scala/RandomAccessSeq$object.Projection.html#map%28%28A%29%3D%3EB%29
):
scala> def aux(x: Int) = {
| println("Dobrando " + x)
| 2 * x
| }
aux: (Int)Int
scala> def f(n: Int): Unit = {
| println("vou gerar")
| val lst = (1 to n).map(aux(_))
| println("Gerado")
| lst.foreach(println(_))
| }
f: (Int)Unit
scala> f(10)
vou gerar
Gerado
Dobrando 1
2
Dobrando 2
4
Dobrando 3
6
Dobrando 4
8
Dobrando 5
10
Dobrando 6
12
Dobrando 7
14
Dobrando 8
16
Dobrando 9
18
Dobrando 10
20
Ou seja: a função aux() so seré avaliada no momento em que rodar o
corpo do foreach. Funciona como se fosse uma variável lazy. Como eu
deveria fazer se eu quisesse que a função aux() fosse executada
imediatamente ("eager")? Ou seja, para aparecer algo como:
scala> f(10)
vou gerar
Dobrando 1
Dobrando 2
Gerado
2
4
Grato,
Rafael U. C. Afonso