Scala: come & # 8220; conservare & # 8221; una funzione in una var?
-
05-07-2019 - |
Domanda
Sto imparando Scala e sto cercando di memorizzare una funzione in una var per valutarla in seguito:
var action:() => Any = () => {}
def setAction(act: => Any) {
action = act
}
ma ciò non viene compilato:
errore: tipo non corrispondente;
trovato: Qualsiasi
richiesto: () = > qualsiasi
action = act
Quindi mi sembra che in action = act
invece di assegnare la funzione, la sta valutando e assegnando il risultato.
Non riesco a scoprire come assegnare la funzione senza valutarla.
Grazie!
Soluzione
Tipo di nota " () = > Qualsiasi " non è lo stesso del parametro per nome " = > Qualsiasi " ;. Digita " () = > Qualsiasi " è una funzione che non accetta alcun parametro e restituisce Any, mentre il parametro per nome " = > Qualsiasi " ritarda l'esecuzione del parametro fino a quando non viene utilizzato e restituisce Any.
Quindi quello che devi fare qui è il seguente:
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
Altri suggerimenti
Penso che la tua dichiarazione dei parametri sia sbagliata. Questo è probabilmente quello che vuoi se vuoi semplicemente memorizzare una funzione in una var per un uso successivo:
def setAction(act:() => Any) {
action = act
}
e quindi:
scala> def p() { println("hi!") }
p: ()Unit
scala> setAction(p)
scala> action()
hi!
res2: Any = ()