Groovy:更新闭包内部的外部变量形式

wribegjk  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(58)

下面是一段Groovy代码:

import groovy.xml.StreamingMarkupBuilder;

def processData() {
     // xml builder
    def xmlBuilder = new StreamingMarkupBuilder()
    xmlBuilder.encoding = 'UTF-8'
    
    // data
    def body = [1, 2, 3]
    flag = '0'
    
    def idocXML = xmlBuilder.bind {
        ROOT {
            body.each { line ->
                flag = '1'
            }
        }
    }// end of xml builder bind
   
    println("$flag")
}

processData()

字符串
在代码片段中,processData内部有一个变量flag,初始化为0,在xmlBuilder.bind和body的迭代中,我将flag更新为1。但是在这些闭包之外,当我打印flag时,它显示为0。
如何从身体内部将标志更新为1。每个封闭?谢谢

7uzetpgm

7uzetpgm1#

您的代码通常是正确的,并且会做它应该做的事情。问题是,这个bind闭包被声明了,但实际上从未被调用。您声明了XML应该如何构造,但您从未“触发”构造本身。让我向您展示我的意思以及我是如何发现它的。我的第一个问题是,这flag = '1'行是否被执行了?我通过添加额外的输出更改了代码:

body.each { line ->
    println "line = $line" // this is the line I've added.
    flag = '1'
}

字符串
正如你所看到的,它什么也不打印。为什么?因为,正如我上面写的,你描述了你的idocXML对象必须如何构造,但你从来没有使用过这个对象。这就是为什么这个绑定闭包从来没有被调用过。下面是按预期工作的代码:

import groovy.xml.StreamingMarkupBuilder;

def processData() {
    // xml builder
    def xmlBuilder = new StreamingMarkupBuilder()
    xmlBuilder.encoding = 'UTF-8'

    // data
    def body = [1, 2, 3]
    flag = '0'

    def idocXML = xmlBuilder.bind {
        ROOT {
            body.each { line ->
                println "line = $line" // make sure that binding is actually calledd
                flag = '1'
            }
        }
    }// end of xml builder bind

    println idocXML.toString() // do something with the object to actually call binding

    println("$flag") // now, at that point, the flag will have a new value, because the binding logic updated it.
}

processData()


希望能帮上忙。

相关问题