动态生成闭包

时间:2013-11-05 12:08:11

标签: groovy closures groovyws

动态生成闭包

我在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)
}

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

2 个答案:

答案 0 :(得分:3)

Builder闭包是普通的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,而不是定义一个新的内联。)

答案 1 :(得分:2)

使用您的items关闭,这可能有效:

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

如果您需要art:validate

中的其他内容
相关问题