Observer pattern或callback是Java中廣泛使用的設計模式。但是,對匿名類實現回調接口是一件非常痛苦的事情,所以在Scala中通常會爲這些回調類實現引入隱式轉換。例如,對於Runnable接口隱式轉換:Scala:傳遞沒有參數的函數參數
implicit def func2Runnable[F](f: => F): Runnable =
new Runnable {
def run() {
f
}
}
並假設有一些聽衆註冊表:
def addMyListener(m: Runnable) {
// mock function for test
for (i <- 1 to 2) {
m.run()
}
}
然後隱式轉換神奇壓實我的代碼:
addMyListener(println("Printed twice"))
問題:
當我通過多行代碼塊addMyListener(),只有代碼的最後一行被傳遞給它:
addMyListener {
println("This line is printed once")
println("Only this is printed twice")
}
已知的解決方法:
予加在轉換功能的括號:
implicit def func2Runnable[F](f:() => F): Runnable =
new Runnable {
def run() {
f()
}
}
但是,當我們使用它,它是冗長:
addMyListener(() => println("Printed twice"))
addMyListener {() =>
println("This line is printed twice")
println("This is also printed twice")
}
是否有一個更清晰的解決方案來揭露這個?
好。感謝您的洞察,desugared隱式函數只應用於最後一行。但是,偵聽添加功能通常由第三方編寫,所以我們不能修改它;如果我可以修改它,我根本不會使用Runnable !. – pocorall
所以有{...} .runnable,這在我的選擇中更安全,因爲它會阻止你在隱含的地方應用隱含的內容。在我的android應用程序中,我使用一系列促進方法來做類似的事情。 – pedrofurla
嘖嘖,我錯過了。謝謝。 – pocorall