gpt4 book ai didi

groovy - Groovy 中 Map 的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 17:12:12 25 4
gpt4 key购买 nike

我在编写代码时注意到 Groovy 中处理 XML 和 Maps 时的一些奇怪行为。我想了想,不明白为什么会这样,应该这样。

我用 3 个示例编写了示例代码。 map1 和 map3 之间的关键区别仅在于以下部分:

map 1:

map1 << ["${it.name()}":it.value()]

map 3:
map3["${it.name()}"]=it.value()

这是完整的代码,您可以将其复制粘贴到 Groovy 控制台中:
def xml = '<xml><head>headHere</head><body>bodyHere</body></xml>'


Map map1 = [:]

def node = new XmlParser().parseText(xml)

node.each {
map1 << ["${it.name()}": it.value()]
}

println map1
println map1["head"]

println ">>>>>>>>>>>>>>>>>>>>>>"



Map map2 = [:]

map2 << ["head":"headHere"]
map2 << ["body":"bodyHere"]

println map2
println map2["head"]

println "<<<<<<<<<<<<<<<<<<<<<<"



def xml2 = '<xml><head>headHere</head><body>bodyHere</body></xml>'

Map map3 = [:]

def node2 = new XmlParser().parseText(xml2)

node2.each {
map3["${it.name()}"]=it.value()
}

println map3
println map3["head"]

我得到的结果如下:
[head:[headHere], body:[bodyHere]]
null

[head:headHere, body:bodyHere]
headHere

[head:[headHere], body:[bodyHere]]
[headHere]

即使你 map1 和 map3 看起来一样,map["head"] 的结果是完全不同的,第一个给出 null,第二个给出实际结果。我不明白为什么会这样。我花了一些时间,但仍然不明白。我用过 .getProperty()获取一个类的信息,但它在 map 和内部对象上看起来和感觉都一样。我尝试了更多的东西,但没有任何东西让我知道发生了什么。我什至尝试了不同的操作系统(Win XP、Mac OS),但仍然没有。

我已经没有任何想法了,请您解释一下奇怪的行为,为什么会发生这种情况以及 map << [key:object] 和有什么区别?和 map[key] = object ?

谢谢你。

最佳答案

可能有帮助的一件事是,不要将 GStrings 用于您的 key 。 Groovy 支持将对象直接包装在括号中作为键使用。

来自 the manual :

Map keys are strings by default: [a:1] is equivalent to ["a":1]. But if you really want a variable to become the key, you have to wrap it between parentheses: [(a):1].



完全工作的例子:
def xml = '<xml><head>headHere</head><body>bodyHere</body></xml>'

Map map1 = [:]
def node = new XmlParser().parseText(xml)
node.each {
map1 << [ (it.name()): it.value() ]
}

println map1
println map1["head"]
println ">>>>>>>>>>>>>>>>>>>>>>"

Map map2 = [:]

map2 << ["head":"headHere"]
map2 << ["body":"bodyHere"]

println map2
println map2["head"]

println "<<<<<<<<<<<<<<<<<<<<<<"

def xml2 = '<xml><head>headHere</head><body>bodyHere</body></xml>'

Map map3 = [:]

def node2 = new XmlParser().parseText(xml2)

node2.each {
map3[it.name()] = it.value()
}

println map3
println map3["head"]

输出是:
[head:[headHere], body:[bodyHere]]
[headHere]
>>>>>>>>>>>>>>>>>>>>>>
[head:headHere, body:bodyHere]
headHere
<<<<<<<<<<<<<<<<<<<<<<
[head:[headHere], body:[bodyHere]]
[headHere]

关于groovy - Groovy 中 Map 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7591036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com