【问题标题】:Dynamically generated closure动态生成的闭包
【发布时间】:2013-11-05 12:08:10
【问题描述】:

动态生成的闭包

我已经在 groovy wslite 中编写了肥皂请求:

def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                item(itemValue)
            }
        }
    }

它工作正常,但现在我必须将其更改为列表,所以最后它会是这样的:

def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                item(itemValue)
            item(itemValue2)
            item(itemValue3)
            }
        }
    }

但是知道如何从 List 动态创建此请求。我什至把它提取到变量中:

def items = {
                item(itemValue)
            item(itemValue2)
            item(itemValue3)
}

但我不知道如何在此闭包中添加新项目。有什么简单的方法吗?

【问题讨论】:

    标签: groovy closures groovyws


    【解决方案1】:

    构建器闭包是普通的 Groovy 代码,所以类似于

    def values = [itemValue, itemValue2, itemValue3]
    def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                values.each { item(it) }
            }
        }
    }
    

    应该可以正常工作。或者如果你有

    def items = {
            item(itemValue)
            item(itemValue2)
            item(itemValue3)
    }
    

    那你就可以了

    def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate'(items)
        }
    }
    

    (将现有的闭包传递给art:validate,而不是定义一个新的内联闭包)。

    【讨论】:

    • 不错的调用将闭包传递给art:validate :-)
    【解决方案2】:

    使用您给定的 items 闭包,这可能会起作用:

    def request = {
        envelopeAttributes('xmlns:art': 'http://url')
        body {
            'art:validate' {
                items.delegate = delegate
                items()
            }
        }
    }
    

    如果你在art:validate里面需要其他东西

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多