1

我试图更好地理解 groovy 并遇到了这种用法。

在使用 Http-Builder 时发现了这一点,尽管我的问题与此无关——我主要感兴趣的是为隐含的一般用例找到“groovy-way”。

有一个现有的“请求”方法接受一个闭包,当 http-builder 调用该闭包时,它会传递一个参数,即“请求”。将其他信息传递给此类闭包的最佳方法是什么?

正常使用后,代码可能类似于:

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

在此示例中,我希望能够动态设置(或传入)三个值 - 路径和查询参数 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)

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

4

2 回答 2

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' )
于 2013-08-12T14:12:19.947 回答
2

只是为了添加另一个选项,您可以使用柯里化。

Groovy - 闭包正式定义

维基百科 - 柯里化

您要做的是一个带有 4 个参数的闭包,例如:

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

然后你会调用 httpClient currying 闭包的前 3 个参数:

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