2009-10-23 19 views
7

estoy aprendiendo Scala y estoy tratando de almacenar una función en un var para evaluar más adelante:Scala: ¿Cómo "almacenar" una función en una var?

var action:() => Any =() => {} 
def setAction(act: => Any) { 
    action = act 
} 

pero eso no quiere compilar:

error: type mismatch;
found: Any
required:() => Any
action = act

Así que me parece que en action = act en lugar de asignar la función, la evalúa y asigna el resultado.
No puedo encontrar la forma de asignar la función sin evaluarla.

Gracias!

Respuesta

15

Nota tipo "() => Cualquiera" no es lo mismo que parámetro de nombre "=> Cualquiera". Type "() => Any" es una función que no toma ningún parámetro y devuelve Any, mientras que el parámetro by-name "=> Any" demora la ejecución del parámetro hasta que se usa y devuelve Any.

Así que lo que hay que hacer aquí es la 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 
+0

Gracias Walter, que me ayudó mucho a entender un poco más Scala – Damian

2

Creo que eres declaración de parámetros es incorrecto. Esto es probablemente lo que quiere si simplemente desea almacenar una función en un var para su uso posterior:

def setAction(act:() => Any) { 
    action = act 
} 

y luego:

scala> def p() { println("hi!") } 
p:()Unit 

scala> setAction(p) 

scala> action() 
hi! 
res2: Any =() 
Cuestiones relacionadas