6

Scala で DSL を実装したい場合、次の方法はありますか?

関数を含む「Draw」というオブジェクトがありますdef draw(d:Drawable)

オブジェクトをインポートして、次のようにオブジェクトの外部で呼び出すことができるようにするにはどうすればよいですか。

draw ball

ボールが Drawable トレイトを拡張する場合? 問題は、一種の中置表記で draw を使用したいということですが、クラス/オブジェクトを実装していることを示すことで関数 draw を修飾したくありません。

4

2 に答える 2

6

あなたはそれをすることはできません。4 つの前置演算子を除いて、どの演算子表記でも、最初のトークンはオブジェクトを表します。

于 2010-05-19T21:02:04.337 に答える
3

すぐに試してみましたが、オブジェクトを使用してかなり機能させることができました。そこで、必要に応じて、ドローボールの代わりにドロー(ボール)を使用する必要がありました。


Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).

scala> trait Drawable{def doSomething} defined trait Drawable

scala> object Draw {
def draw(d:Drawable) = d.doSomething } defined module Draw

scala> val ball = new Drawable{def doSomething = println("doing ball")} ball: java.lang.Object with Drawable = $anon$1@3a4ba4d6

scala> import Draw._ import Draw._

scala> draw ball :11: error: missing arguments for method draw in object Draw; follow this method with `_' if you want to treat it as a partially applied function draw ball ^

scala> draw(ball) doing ball

ただし、Drawをクラスとして定義することにより、機能しました。


scala> trait Drawable{def doSomething: Unit}
defined trait Drawable

scala> class Draw {
def draw(d:Drawable) = d.doSomething } defined class Draw

scala>

scala> val ball = new Drawable{def doSomething = println("doing ball")} ball: java.lang.Object with Drawable = $anon$1@36a06816

scala> val d = new Draw d: Draw = Draw@7194f467

scala> d draw ball doing ball

なぜこれがオブジェクトで同じように機能しないのか、バグであるか、特定の動作である可能性があるのか​​、完全にはわかりません。しかし、今のところ調べる時間がありませんでした。

于 2010-05-19T19:32:52.977 に答える