Eğer içinde argüman geçirmek istediğiniz tam olarak nerede dayanarak bunu yapabilir, en az iki yolu vardır ilk. yolu, sahip olduğunuz main
'u sakladığınız yerdir.
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))
}
}
bir başka yöntem, bu gibi geri arama noktasında parametre geçmektir: timeFlies
imza (Int) => Unit
sahiptir
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)
}
}
Not, ama timeFlies(5)
nedeniyle, imza => Unit
sahip partial application. Bu temel olarak, daha az parametre alan bir işlevi otomatik olarak oluşturmak için parametreyi uygulayabileceğiniz anlamına gelir. Int
parametresini daha önce geri çağırma işlemine uyguladıysanız, oncePerSecond
imzasında bilmesi gerekir.
Her iki yöntem de farklı kullanım durumları için kullanışlıdır. İlk yol, oncePerSecond
'un geriçağırımın parametrelerini bilmesine izin vermez. İkinci yol, isterseniz her zaman döngü boyunca x
değerini değiştirmenizi sağlar.
Siz * gerçekten * Int'i 'oncePerSecond' olarak iletmeniz gerekiyor mu? Aşağıdaki tüm cevaplar iyi olmalı ve Int. Neyse, bir kerePerSecond (timeFlies, 5) 've' def defolu bir kerePerSecond (geri arama: Int => Birim, x: Int) 'çalışmalıdır. – Dimitri