在我学习 Scala 的过程中,我尝试用回调实现一个简单的 DSL
object Button {...} // apply
class Button(val name: String) {
private val: => Unit; // doesn't work
def click(f: => Unit) = {
_click_cb = f
this
}
def onClick() = this._click_cb()
}
Button("Click me!") click {println("Clicked!")}
我创建了一个新对象,将它传递给存储的回调。我的演示框架触发onClick
方法,应该调用存储的方法
它适用,() => Unit
但我的 DSL 看起来很丑:
Button("Click me!") click (() => println("Clicked!"))
当然,我可以onClick
稍后做抽象并实现一个匿名类
new Button("Click me!") {def onClick = println("Clicked!")}
但我想玩一些 DSL 之类的
问题是:
f
我该如何存放_click_cb
?- 如何提供初始“空”功能
_click_cb
? - 也许有更多的scala方式来实现这一点?(没有匿名类)