Ci sono almeno due modi per farlo, a seconda di dove esattamente si vuole passare l'argomento nel primo. il modo è dove tieni main
come se lo avessi.
object Timer {
def oncePerSecond(callback: => Unit) {
while (true) { callback; Thread sleep 1000 }
}
def timeFlies(x: Int) {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies(5))
}
}
L'altro metodo è quello di passare il parametro in corrispondenza del punto della richiamata, in questo modo:
object Timer {
def oncePerSecond(callback: (Int) => Unit) {
val x = 5
while (true) { callback(x); Thread sleep 1000 }
}
def timeFlies(x: Int) {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
noti che timeFlies
ha la firma (Int) => Unit
, ma timeFlies(5)
ha la firma => Unit
, a causa di partial application. Ciò significa che è possibile applicare il parametro per creare automaticamente una funzione che richiede meno parametri. oncePerSecond
ha bisogno di sapere nella sua firma se hai già applicato il parametro Int
alla richiamata o meno.
Entrambi i metodi sono utili per diversi casi d'uso. Il primo modo consente a oncePerSecond
di non conoscere i parametri del callback. Il secondo modo ti consente di modificare il valore di x
ogni volta che lo desideri.
fonte
2014-12-11 23:05:02
Avete * veramente * bisogno di passare l'Int a 'oncePerSecond'? Tutte le risposte qui sotto dovrebbero andare bene e sono meglio che passare quella Int. Ad ogni modo, 'oncePerSecond (timeFlies, 5)' e 'def oncePerSecond (callback: Int => Unit, x: Int)' dovrebbe funzionare. – Dimitri