ejemplos - funciones en scala
Diferencias entre estas tres formas de definir una funciĆ³n en Scala (3)
Dentro de una clase, val
se evalúa en la inicialización mientras que def
se evalúa solo cuando, y cada vez , se llama a la función. En el siguiente código, verá que x se evalúa la primera vez que se usa el objeto, pero no de nuevo cuando se accede al miembro x. Por el contrario, y no se evalúa cuando se crea una instancia del objeto, sino que se evalúa cada vez que se accede al miembro.
class A(a: Int) {
val x = { println("x is set to something"); a }
def y = { println("y is set to something"); a }
}
// Prints: x is set to something
val a = new A(1)
// Prints: "1"
println(a.x)
// Prints: "1"
println(a.x)
// Prints: "y is set to something" and "1"
println(a.y)
// Prints: "y is set to something" and "1"
println(a.y)
Dadas tres formas de expresar la misma función f(a) := a + 1
:
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
¿Cómo difieren estas definiciones? El REPL no indica ninguna diferencia obvia:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
Ejecutar una definición como def x = e no evaluará la expresión e . En cambio, e se evalúa cada vez que se usa x . Alternativamente, Scala ofrece una definición de valor val x = e, que sí evalúa la e del lado derecho como parte de la evaluación de la definición. Si x se usa posteriormente, se reemplaza inmediatamente por el valor pre-calculado de e , de modo que la expresión no necesita ser evaluada nuevamente.
Scala por ejemplo por Martin Odersky
f1
es una función que toma un número entero y devuelve un número entero.
f2
es un método con cero arity que devuelve una función que toma un entero y devuelve un entero. (Cuando escribe f2
en REPL más tarde, se convierte en una llamada al método f2
).
f3
es lo mismo que f2
. No estás empleando inferencia tipo allí.