[英]Scala: store call-by-name variable as class field
在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
提供初始“空”功能? 一個更丑陋的版本,只是為了顯示惰性val可以保留by name參數值而不對其求值:
case class Button(val name: String) {
def clickCallback(): Unit = ()
def click(f: => Unit) = {
lazy val notEvaluated = f
new Button(name) { override def clickCallback() = notEvaluated }
}
def onClick(): Unit = clickCallback()
}
更干凈,功能更強大的實現:
class Button(val name: String) {
def click(f: => Unit) = new Button(name) { override def onClick() = f }
def onClick(): Unit = ()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.