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

Groovy: Update external variable form inside a closure

提问人:Suwandi Cahyadi 提问时间:10/27/2023 更新时间:10/27/2023 访问量:21

问:

我在下面有以下时髦的代码片段:

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()

在代码片段中,在初始化为 0 的 processData 中有一个变量标志,在 xmlBuilder.bind 和 body 的迭代中,我将标志更新为 1。但是在这些闭包之外,当我打印标志时,它显示为 0。

如何从body.each闭合内部将标志更新为1?谢谢

变量 Groovy 闭包

评论


答:

1赞 Andrej Istomin 10/27/2023 #1

你的代码通常是正确的,并且会做它应该做的事情。问题在于,这个关闭是声明的,但实际上,从未调用过。您声明了 XML 应该如何构造,但您从未“触发”构造本身。 让我告诉你我的意思,以及我是如何发现的。我的第一个问题是,这条线到底被执行了吗?我通过添加额外的输出来更改代码:bindflag = '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()

我希望它有所帮助。