Tengo esta situación extraña que no entiendo. Estoy leyendo el libro "Programación en Scala", cap. 9.Cosas raras con función al curry
Digamos que tengo una función al curry:
def withThis(n:Int)(op:Int=>Unit){
println("Before")
op(n);
println("After")
}
Cuando lo llamo con un argumento dentro de un rizado-sintaxis especial funciona como se esperaba:
withThis(5){
(x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After
Sin embargo, si poner dos declaraciones, obtengo algo extraño:
withThis(5){
println("Hello!")
println(_)
}
// Outputs
Hello!
Before
5
After
¿Cómo es que "¡Hola!" se imprime antes de "Antes" y luego se imprime "5" en el interior? ¿Estoy loco?
Pero println (x => x) ni siquiera es la sintaxis correcta. En cualquier caso, entiendo lo que println (_) hace, era más confuso en cuanto a este negocio de "bloqueos". – drozzy
La sintaxis es correcta. No compilaría en este caso debido al tipo de parámetro faltante, pero funcionaría si el compilador pudiera inferirlo. Ejemplo trivial: 'def doit (f: Int => Int) =(); doit (x => x) ' –
Sé que es equivalente" (x: Int) => println (x) ", mi pregunta es por qué realmente ejecuta println primero. Supongo que respondiste con "bloquear siempre devuelve el último valor". ¿Esto significa que los bloques no se evalúan de forma perezosa? – drozzy