Scala: ¿Cómo “almacenar” una función en una var?
-
05-07-2019 - |
Pregunta
Estoy aprendiendo Scala y estoy tratando de almacenar una función en una var para evaluarla más adelante:
var action:() => Any = () => {}
def setAction(act: => Any) {
action = act
}
pero eso no se compila:
error: no coincide el tipo;
encontrado: cualquier
requerido: () = > Cualquier
acción = actuar
Por lo tanto, me parece que en action = act
en lugar de asignar la función, está evaluándola y asignando el resultado.
No puedo & # 180; t averiguar cómo asignar la función sin evaluarla.
¡Gracias!
Solución
Tipo de nota " () = > Cualquier " no es lo mismo que el parámetro de nombre " = > Cualquier " ;. Escriba " () = > Cualquier " es una función que no toma ningún parámetro y devuelve Cualquiera, mientras que el parámetro by-name " = > Cualquier " retrasa la ejecución del parámetro hasta que se usa y devuelve Cualquiera.
Entonces, lo que debe hacer aquí es lo siguiente:
var action: () => Any = null
def setAction(act: => Any) = action = () => act
setAction(println("hello")) // does not print anything
action() // prints "hello"
setAction(123)
action() // returns 123
Otros consejos
Creo que la declaración de parámetros es incorrecta. Esto es probablemente lo que desea si simplemente quiere almacenar una función en una var para usarla más adelante:
def setAction(act:() => Any) {
action = act
}
y luego:
scala> def p() { println("hi!") }
p: ()Unit
scala> setAction(p)
scala> action()
hi!
res2: Any = ()