5

私はGroovyが初めてで、特定のタスクのためにミニDSLを書こうとしています。この目的のために、私は以下のような問題を解決しようとしています: このコードを呼び出して (括弧を使用せずに) 5 を出力 (および/または返し) したい:

give me 5 

以下のような定義が機能すると予想しました。

def give = {clos ->  return clos} 
def me = {clos ->  println clos; return clos} 

しかし、実際にはそうではありません。「give」と「me」を定義して、「give me 5」という式で値 5 を返す方法を教えてください。ここで、meはクロージャーでなければなりません。give はメタクラス、プロパティなどでもかまいません。

前もって感謝します!Ⅳ

4

3 に答える 3

3

Groovy 1.8+ テイク

give me 5

パーサーは効果的に次のことを試みます。

give( me ).5

したがって、次のようにコードを記述すると、機能します。

def give = { map ->  map } 
def me = [:].withDefault { it }

a = give me 5

println a

プリント:

5
于 2012-08-10T09:20:17.373 に答える
1

あなたの閉鎖は正しいです。ブレースがありません。これを試して

give(me(5)) or 
give me(5)

それ以外の場合は、中括弧を完全に削除する必要がある場合は、その部分を変数に割り当てて、パーサーが正確に何を渡す必要があるかを理解できるようにします。

five = me 5
give five
于 2012-08-10T09:16:17.770 に答える
-1

あなたの方法は何をするつもりですか?あなたは構文要件を書きました:

give me 5

あなたの場合、次のものが必要です。

give("me", 5)
give "me", 5 //equivalent "DSL" notation
give("you", 7)
give "you", 7 //equivalent "DSL" notation

//or...
def me= "Mickey", you= "Donald"
give(me, 5)
give me, 5 //equivalent "DSL" notation
give(you, 7)
give you, 7 //equivalent "DSL" notation

meが変わらない場合、セマンティクスは次のようになります。

giveMe(5)
giveMe 5 //equivalent "DSL" notation

あなたは構文上の制約から始めて、「私はクロージャーでなければならない」と「括弧なしでルールを機能させたい」と書いています。常にセマンティック要件から始めてください:-)

于 2012-08-10T12:54:20.483 に答える