2009-10-23 7 views
7

j'apprends Scala et je suis en train de stocker une fonction dans un var pour l'évaluer plus tard:Scala: Comment "stocker" une fonction dans un var?

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

mais cela ne compile pas:

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

Il me semble que dans action = act au lieu d'attribuer la fonction, il l'évalue et attribue le résultat.
Je ne peux pas savoir comment affecter la fonction sans l'évaluer.

Merci!

Répondre

15

Notez le type "() => Tout" n'est pas le même que le paramètre "by-name" => Any ". Tapez "() => Any" est une fonction qui ne prend aucun paramètre et renvoie Any, alors que le paramètre by-name "=> Any" retarde l'exécution du paramètre jusqu'à ce qu'il soit utilisé et renvoie Any.

Donc ce que vous devez faire ici est la suivante:

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

Merci Walter, il m'a beaucoup aidé à comprendre un peu plus scala – Damian

2

Je pense que vous êtes la déclaration paramètre est erroné. Ceci est probablement ce que vous voulez si vous voulez simplement enregistrer une fonction dans un var pour une utilisation ultérieure:

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

puis:

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

scala> setAction(p) 

scala> action() 
hi! 
res2: Any =() 
Questions connexes