提问人:Suwandi Cahyadi 提问时间:10/27/2023 更新时间:10/27/2023 访问量:21
Groovy:更新闭包内的外部变量形式
Groovy: Update external variable form inside a closure
问:
我在下面有以下时髦的代码片段:
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?谢谢
答:
1赞
Andrej Istomin
10/27/2023
#1
你的代码通常是正确的,并且会做它应该做的事情。问题在于,这个关闭是声明的,但实际上,从未调用过。您声明了 XML 应该如何构造,但您从未“触发”构造本身。
让我告诉你我的意思,以及我是如何发现的。我的第一个问题是,这条线到底被执行了吗?我通过添加额外的输出来更改代码:bind
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()
我希望它有所帮助。
评论