1

私は groovy をよりよく理解しようとしており、この使用法に出くわしました。

私の質問はそれとは無関係ですが、Http-Builderを使用しているときにこれを見つけました-私は主に、暗示される一般的なユースケースの「グルーヴィーな方法」を見つけることに興味があります。

クロージャーを受け取る既存の「リクエスト」メソッドがあり、http-builder がそのクロージャーを呼び出すと、「リクエスト」という 1 つのパラメーターが渡されます。このようなクロージャーに渡される追加情報を取得する最良の方法は何ですか?

通常の使用法に従うと、コードは次のようになります。

myHttpClient.request(POST) { req ->
   uri.path = 'some path'
   uri.query = [ p1:'value1', p2:'value2' ]
....
}

この例では、3 つの値 (パス、およびクエリ パラメータ 1 と 2 の値) を動的に設定 (または渡し) できるようにしたいと考えています。

私は正しい方法を知るのに十分な方法を知りませんが、次のようなことをしました:

EDITはコードをクリーンアップしました

def myPath = '/a/b/c'
def p1Param = 'p1Value'
def p2Param = 'p2Value'
def myClosure = { req -> 
   uri.path = myPath
   uri.query = [ p1:p1Param, p2:p2Param ]
....
}

// first call:
myHttpClient.request(POST, myClosure)
// later on: 
myPath = '/new/path'
p1Param = 'newValue1'
p2Param = 'newValue2'
myHttpClient.request(POST, myClosure)

これは機能し、DRYですが、醜いので、もっと良い方法があると思います/願っています。また、呼び出し全体を独自のクロージャーに入れて、単にそれを呼び出すことも考えました。これも、より良い方法があることを望んでいました!

4

2 に答える 2

2

別のオプションを追加するだけで、カリー化を使用できます。

Groovy - クロージャーの正式な定義

ウィキペディア - カリー化

あなたがすることは、次のような 4 つのパラメーターを取るクロージャーです。

def reqClosure = { path, p1, p2, req ->
    uri.path = path
    uri.query = [ p1: p1, p2: p2 ]
    ...
}

次に、クロージャーの最初の 3 つのパラメーターをカリー化する httpClient を呼び出します。

myHttpClient.request POST, reqClosure.curry('/new/path', 'value1', 'value2')
于 2013-08-14T15:33:58.187 に答える