Es gibt mindestens zwei Möglichkeiten, wie Sie es tun können, je nachdem, wo genau wollen Sie in das Argument zu übergeben: Die erste. Weg ist, wo Sie main
halten, wie Sie es hatten.
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))
}
}
Die andere Methode ist es, die Parameter in an der Stelle des Callback passieren, wie folgt aus:
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)
}
}
anzumerken, dass timeFlies
die Signatur (Int) => Unit
, aber timeFlies(5)
hat die Signatur => Unit
wegen partial application. Dies bedeutet im Wesentlichen, dass Sie den Parameter anwenden können, um automatisch eine Funktion zu erstellen, die weniger Parameter benötigt. oncePerSecond
muss in seiner Signatur wissen, ob Sie den Int
Parameter bereits auf den Rückruf angewendet haben oder nicht.
Beide Methoden sind für verschiedene Anwendungsfälle nützlich. Die erste Möglichkeit lässt oncePerSecond
nicht über die Parameter des Rückrufs wissen. Die zweite Möglichkeit lässt Sie den Wert von x
jedes Mal durch die Schleife ändern, wenn Sie möchten.
Müssen Sie * wirklich * den Int an 'oncePerSecond' übergeben? Alle Antworten sollten in Ordnung sein und sind besser als das Int. Wie auch immer, 'oncePerSecond (timeFlies, 5)' und 'def oncePerSecond (Rückruf: Int => Unit, x: Int)' sollte funktionieren. – Dimitri