2

DSL のルールに「アクティブ」フラグを実装したいと考えています。これが私がそれをどのように見せたかったかです:

Shipping("Standard") {
    active: true
    description: "some text"

    rules {
      ... define rules here
    }
}

いくつかのチュートリアルに従ってすべてを実行する方法は次のとおりです。

Script dslScript = new GroovyShell().parse(new File("Standard"))

dslScript.metaClass.Shipping = { String name, Closure cl ->
  ShippingDelegate delegate = new ShippingDelegate()
  delegate.name = name
  cl.delegate = delegate
  cl.setResolveStrategy Closure.DELEGATE_FIRST
  cl()
}

dslScript.run()

ShippingDelegate は単純です。

class ShippingDelegate {

  String name

  void rules(Closure cl) {
    ... do stuff here
  }
}

すべて問題なく動作しますが、「アクティブ」または「説明」にアクセスするにはどうすればよいですか?

とにかく、この構文は実際に何をしますか? マップ割り当てのように見えますが、何もありません。それとも、Groovy コンパイラはそれを不完全な三項演算子として扱いますか?

4

2 に答える 2

4

設計を簡素化できるように、DSL を少し変更することを提案してもよろしいですか?

編集済み、複数の配送インスタンスがある場合、例では明確ではありません。2回目の試行では、答えはイエスだと思います

class ShippingRules {
    boolean active
    String description
    String name


    ShippingRules(String name) {
        this.name=name
    }

    def rules(Closure c) {
        c.delegate=this
        c()
    }
}



abstract class ShippingRulesScript extends Script {
    def shipppingRules =[]

    def shipping(String name, Closure c) {
        def newRules=new ShippingRules(name)
        shipppingRules << newRules
        c.delegate=newRules
        c()
    }
}

def cfg= new CompilerConfiguration(
    scriptBaseClass:ShippingRulesScript.name
)
Script dslScript = new GroovyShell(cfg).parse(new File("Standard"))

dslScript.run()

DSL を次のように変更する必要があります。

shipping("Standard") {
    active= true
    description= "some text"

    rules {
      ... define rules here
    }
}
shipping("International") {
    active= true
    description= "some text"

    rules {
      ... define rules here
    }
}

つまり、輸送に資本を失い、コロンの代わりに代入を使用します。

その後、dslScript shippingRules 変数から配送ルールを取得できます。

免責事項:現在、コードをテストできないため、コードにタイプミスがある可能性がありますが、一般的な考え方はわかります: ルールとプロパティをスクリプトに提供する基本クラスを使用してください。

于 2012-05-25T20:59:08.023 に答える
0

Google+ で同様の質問をしました。ここを参照してください。
要約すると、map 構文は、コンストラクター (ctors) でのみ、関数パラメーターとして使用できます。

興味深いのは、例外をスローしないことです。

于 2013-05-02T09:58:59.180 に答える