我正在编写代码,当我处理XML和Maps时,我注意到Groovy中有一些奇怪的行为。我想到了它,无法弄清楚为什么会这样,应该这样。
我用3个例子编写了示例代码。 map1&的重要区别map3仅在以下部分:
Map1:
map1 << ["${it.name()}":it.value()]
Map3:
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()
获取类的信息,但它看起来相同,并且在地图和对象里面感觉相同。我尝试了更多的东西,没有什么能让我知道发生了什么。我甚至尝试过不同的操作系统(Win XP,Mac OS),但仍然没有。
我不再有任何想法,请一个人解释奇怪的行为,为什么会发生这种情况以及map << [key:object]
和map[key] = object
之间有什么区别?
谢谢。
答案 0 :(得分:9)
可能有用的一点是,不要将GStrings用于你的密钥。 Groovy支持将对象直接用作键,将它们包装在括号中。
来自the manual:
默认情况下,地图键是字符串:[a:1]相当于[“a”:1]。但是如果你真的想要一个变量成为关键,你必须将它包装在括号中:[(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]
答案 1 :(得分:2)
以下是此quirk of double quoted strings in Groovy的演示:
如果没有,则双引号字符串为普通
java.lang.String
插值表达式,但如果是groovy.lang.GString
个实例 插值存在。
groovy:000> m = [:]
===> {}
groovy:000> tmp = "wat"
===> wat
groovy:000> key = "${tmp}"
===> wat
groovy:000> m << ["${key}": "hi"]
===> {wat=hi}
groovy:000> m["${key}"] = "hi"
===> hi
groovy:000> m
===> {wat=hi, wat=hi}
groovy:000> m["wat"] = "fuuuuuu!"
===> fuuuuuu!
groovy:000> m
===> {wat=hi, wat=fuuuuuu!}
groovy:000> m.keySet().each { println it.class }
class org.codehaus.groovy.runtime.GStringImpl
class java.lang.String
享受;)