4

私はScalaでDSLを構築していますが、そのようなオブジェクトがあります。

object block {
  def apply(content: String): String = "{\n" + content + "}\n"
  def apply(): String = block("empty block")
}

DSLの後半で、次のように言うことができます。

block {
  "good stuff goes here"
}

apply()それは問題ありませんが、ユーザーが空のブロックを記述できるようにするために使用したい2番目の方法があります。これにより、後でそれらを埋めることができます。しかし、コンパイラーは中括弧を使用して引数なしのメソッドを呼び出すことを許可していませんapply()...代わりに括弧を使用する以外にそれを回避する方法はありますか?いいえの場合、なぜこれが許可されないのですか?

更新:参考までに:全体像を把握するには、2つの答えを組み合わせる必要があります。

4

2 に答える 2

6

パラメータのないapplyメソッドの代わりに、Unit無視されるタイプのパラメータを取得させることができます。

def apply(ignored: Unit) = "{\n}\n"

その後、あなたは書くことができます

block {}
于 2012-12-27T14:47:53.300 に答える
0

ついに

object block { 
  def apply[T](content: => T) = "{\n" + 
    (content match { 
      case s: String => s
      case u: Unit => ""
      case a => a.toString 
    }) + "}\n" 
}

編集

動作させるにはblock {}

object block { def apply(content: => Unit) = "{\n" + content + "}\n" }

Unit私は、別の答えのようにだけでなく、名前によるパラメーターを使用することを主張します。なぜなら、実際にはメソッドで=> Unit実行できる関数を作成し、その場で(前に)実行されるコードのブロックをパラメーターとして受け取るだけだからです。block.apply()content: Unitblock.apply()

それblock.applyが「Hoho」を印刷するとします。今:

// content: Unit
block { println("Haha") }
// Haha
// Hoho

// content: => Unit
block { println("Haha") }
// Hoho
// Haha

..。

名前によるパラメーターを使用します。

object block { def apply(content: => String) = "{\n" + content + "}\n" }
于 2012-12-27T14:42:04.870 に答える