1

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ですか?
  • そして、これを達成するためのより多くのスカラウェイがあるでしょうか? (匿名クラスなし)
4

1 に答える 1

2

lazy val が名前によるパラメーター値を評価せずに保持できることを示すためだけの醜いバージョン:

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 = ()
}
于 2015-05-14T07:24:27.443 に答える