【问题标题】:Can additional parameters be added to a Groovy closure invocation?可以向 Groovy 闭包调用添加其他参数吗?
【发布时间】:2013-08-12 14:05:45
【问题描述】:

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

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

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

按照正常使用,代码可能如下所示:

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

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

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

【问题讨论】:

  • 你的意思是uri.path = myPath
  • 是的。现在应该修好了。

标签: groovy


【解决方案1】:

你可以编写一个返回闭包的闭包:

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

然后像这样调用httpClient:

myHttpClient.request( POST ) reqClosure( '/new/path', 'value1', 'value2' )

【讨论】:

  • 就是这样 - 谢谢!我知道应该有更好的方法,只是还不够时髦!
【解决方案2】:

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

Groovy - Closures formal definition

Wikipedia - Currying

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

【讨论】:

  • 同意 - 这是我第一次尝试的思路 - 所以对我来说似乎更直观。当然,由于我不知道“咖喱”,所以这是一个巨大的崩溃和燃烧! :)
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2013-10-06
相关资源
最近更新 更多