观察者模式或回调是 Java 中广泛使用的设计模式。然而,用匿名类实现回调接口是一件很痛苦的事情,因此在 Scala 中为这些回调类的实现引入隐式转换是很常见的。例如,Runnable 接口的隐式转换为:
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")
}
有没有更清洁的解决方案来暴露这个?