Istnieją co najmniej dwa sposoby, można to zrobić, w zależności od tego, gdzie dokładnie chcesz przekazać argument w pierwszej kolejności. droga jest tam, gdzie trzymasz main
, jakbyś ją miał.
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))
}
}
Drugą metodą jest przekazać parametr w co punktu zwrotnego, tak:
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)
}
}
Zauważ, że timeFlies
ma sygnaturę (Int) => Unit
, ale timeFlies(5)
ma sygnaturę => Unit
, z powodu partial application. Zasadniczo oznacza to, że można zastosować parametr, aby automatycznie utworzyć funkcję, która wymaga mniejszej liczby parametrów. oncePerSecond
potrzebuje znać w swoim podpisie, jeśli już zastosowałeś parametr Int
do wywołania zwrotnego, czy też nie.
Obie metody są przydatne w różnych przypadkach użycia. Pierwszy sposób pozwala oncePerSecond
nie wiedzieć o parametrach wywołania zwrotnego. Drugi sposób pozwala zmienić wartość x
za każdym razem w pętli, jeśli chcesz.
Czy naprawdę * potrzebujesz przekazać Int do 'oncePerSecond'? Wszystkie poniższe odpowiedzi powinny być w porządku i lepsze niż przekazanie tego Int. W każdym razie, 'oncePerSecond (timeFlies, 5)' i 'def oncePerSecond (callback: Int => Unit, x: Int)' powinny działać. – Dimitri