Come definirebbe un parametro di ritardo (per nome) che accetta una funzione che prende i parametri?
-
19-09-2019 - |
Domanda
Ho visto un esempio delayed
in "Beginning Scala"
di David Pollak. Ho cercato di adattare tale, per tentativi ed errori. Ecco quello che ho:
def sayhello() = {
println("hello")
}
def delaying(t: => Unit):Unit = {
println("before call")
t
println("after call")
}
delaying(sayhello())
Come ti ritardare una funzione / metodo che accetta i parametri? Perché non posso usare parantheses quando chiamo t
? Dove posso trovare maggiori documentazione sulle funzioni ritardare?
Soluzione
t
non deve essere un valore della funzione. Si tratta semplicemente di qualsiasi passato-by-nome del valore che restituisce Unit
.
Quando si stato t
nella funzione delaying
, non stai chiamando esplicitamente la funzione che è stato passato come quel parametro. Affermando che, si stanno costringendo il parametro passato per nome da valutare, il che significa che sayhello()
viene valutata in quel punto.
Non c'è ragione per cui non è possibile utilizzare i parametri nelle funzioni di parametri passati per nome:
def say(word: String) {
println(word)
}
def delaying(t: => Unit) {
println("before call")
t
println("after call")
}
delaying(say("hello"))
L'unica volta che ci si collegare i parametri al t
all'interno delaying
sarebbe se il suo tipo di ritorno è stato (non Unit
ma) un tipo funzione di parametri taking.
Altri suggerimenti
Dal momento che ho un ricordo terribile e la risposta non fornisce un esempio come dichiarare in realtà un parametro per nome che produce una funzione di prendere uno o più argomenti, mi si avvicinò con questo:
object DelayedEvalTest {
private class DelayedFunction extends Function1[Int,Unit] {
override def apply(x:Int) : Unit = {}
println("function created")
}
private def eval(eval:Boolean, op : Int => Unit ) {
println("in eval()")
if ( eval ) {
op( 42 )
}
}
private def evalDelayed(eval:Boolean, op : => Int => Unit ) {
println("in evalDelayed()")
if ( eval ) {
op( 42 )
}
}
def main(args:Array[String]) {
eval( false , new DelayedFunction() )
evalDelayed( false , new DelayedFunction() )
}
}