是否可以将其他参数添加到Groovy闭包调用中?

时间:2013-08-12 14:05:46

标签: groovy

我试图更好地理解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)

虽然这很有效并且很干,但它也很丑陋,我认为/希望有更好的方法。我还考虑过将整个调用放入自己的闭包中并简单地调用它 - 我再次希望有更好的方法!

2 个答案:

答案 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

Wikipedia - Currying

你要做的是一个带有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')