簡體   English   中英

Scala:將“按姓名致電”變量存儲為類字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM