我试图更好地理解groovy并且遇到了这种用法。
在使用Http-Builder时发现了这一点,虽然我的问题与此无关 - 我主要感兴趣的是找到隐含的一般用例的“groovy-way”。
现有的“request”方法采用闭包,当http-builder调用该闭包时,它会传递一个参数“request”。将更多信息传递给这种闭包的最佳方法是什么?
正常使用后,代码可能如下所示:
myHttpClient.request(POST) { req ->
uri.path = 'some path'
uri.query = [ p1:'value1', p2:'value2' ]
....
}
在这个例子中,我希望能够动态设置(或传入)三个值 - 路径和查询参数1和1的值。 2。
我不知道知道正确的方法,但做了类似的事情:
编辑清理了代码
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)
虽然这很有效并且很干,但它也很丑陋,我认为/希望有更好的方法。我还考虑过将整个调用放入自己的闭包中并简单地调用它 - 我再次希望有更好的方法!
答案 0 :(得分:2)
你可以编写一个返回闭包的闭包:
def reqClosure = { path, p1, p2 ->
{ req ->
uri.path = path
uri.query = [ p1: p1, p2: p2 ]
...
}
}
然后像这样调用httpClient:
myHttpClient.request( POST ) reqClosure( '/new/path', 'value1', 'value2' )
答案 1 :(得分:2)
只需添加其他选项,即可使用currying。
Groovy - Closures formal definition
你要做的是一个带有4个参数的闭包,如:
def reqClosure = { path, p1, p2, req ->
uri.path = path
uri.query = [ p1: p1, p2: p2 ]
...
}
然后你会调用httpClient来解释闭包的前3个参数:
myHttpClient.request POST, reqClosure.curry('/new/path', 'value1', 'value2')