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!

¿Fue útil?

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 = ()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top