3

DSL で使用されているクロージャーからクロージャーを呼び出す方法を知りたいです。たとえば、RestBuilderGrails のプラグインを見てみましょう。

次のようなブロックがいくつか並んでいると想像してください。

rest.post("http://my.domain/url") {
    auth(username, password)
    contentType "text/xml"
    body someContent
}

...唯一の変更点はsomeContent. 毎回authand contentTypeandを呼び出すのが繰り返されます。bodyだから私は次のようなことをしたいと思います:

def oauth = [clientId: 'c', clientSecret: 's']

def withAuth(Closure toWrap) {
    Closure wrapped = { it ->
        auth(oauth.clientId, oauth.clientSecret)
        contentType "text/xml"
        toWrap.call()
    }
    return wrapped
}

rest.post("http://my.domain/url") (withAuth {
    body someContent
})

今、私はDSLで定義されているようにアクセスしたいと思っwrappedています。所有者、代理人などを設定してこれを行う方法はありますか?toWrapauthcontentTypeRestBuilder

(注: 上記の例では、URL + コンテンツを引数として受け取る関数を宣言し、関数rest.post内で呼び出すことができることを理解しています。私の質問はより一般的です。言語を理解しようとしています。より広く適用できる機能的なテクニックです。)

4

2 に答える 2

3

@igor-artamonov のおかげで、私は次の作業アプローチをとっています。スクリプトで変数withAuthを宣言しなくてもスクリプトレベルの状態にアクセスできるように、関数からクロージャーに変更したことに注意してください。@Field

def oauth = [clientId: 'c', clientSecret: 's']

def withAuth { Closure toWrap ->
   return { 
      auth(oauth.clientId, oauth.clientSecret)
      contentType "text/xml"
      toWrap.delegate = delegate
      toWrap.call()
   }
}

rest.post("http://my.domain/url", withAuth {
    body someContent
})
于 2013-08-27T15:32:03.263 に答える