为什么groovy map键求值在使用GString时在类似情况下表现不同?
我希望有人能向我解释为什么以下是正确的:为什么groovy map键求值在使用GString时在类似情况下表现不同?,groovy,Groovy,我希望有人能向我解释为什么以下是正确的: def t = "test" assert [test: 1] == ["test": 1] // 1. expected assert ["$t": 1] != ["test": 1] // 2. unexpected assert ["$t": 1] != [test: 1] // 3. unexpected assert ["$t": 1] == ["$t": 1] // 4. expected println ["$t": 1]
def t = "test"
assert [test: 1] == ["test": 1] // 1. expected
assert ["$t": 1] != ["test": 1] // 2. unexpected
assert ["$t": 1] != [test: 1] // 3. unexpected
assert ["$t": 1] == ["$t": 1] // 4. expected
println ["$t": 1] // output: [test: 1]
println ["test": 1] // output: [test: 1]
我不明白为什么结果2和3之间存在不平等
我在编写一个测试时遇到了这个问题,其中密钥在代码中动态创建,但考虑到测试条件,我知道它应该是字符串“test”。问题是返回的“显示”正确,但不被视为相等。我不明白为什么
此外,以下“工程”:
加上这两行
assert "$t".class.simpleName == 'GStringImpl'
assert t.class.simpleName == 'String'
或者只是
println "$t".class
println t.class
在第一行之后,您将能够理解原因。:)
如果确实要使用t
的值,则应使用as:
assert [(t): 1] == ["test": 1] //use (t) to use the variable value as key
assert [(t): 1] == [test: 1]
assert [(t): 1] != ["$t": 1]
更新
//String key as before, hence encouraged to use (t) instead of GStringImpl
def odd = [("$t".toString()): 1]
assert odd["$t"]
assert odd.test
assert odd["test"]
assert odd."$t"
//Equality by reference and by value in Groovy
assert "$t" == "test" //Value Equality == overridden in Groovy
assert !"$t".is("test") //Object Reference equality equivalent to == in Java
如果有人能想出一个更好的标题?“为什么groovy映射键评估毫无意义?”好的。这显然是正确的。但我想进一步探讨一下……因为“assert”$t“==“test””是真的,但当作为映射键进行计算时,它们并不相等。为什么奇怪的[“$t”]会给出null而不是我所期望的1呢?回应你的编辑:我不知道这个语法是否可用。我假设在冒号的左边可以有“any”表达式?在groovy中,
==
基本上意味着值的相等(equals()
),而不是引用的相等(=
),因此“$t”==“test”
是正确的。其次,odd[“$t”]
生成null,因为“$t”现在是一个GStringImpl键,而不是一个简单的字符串键。因此,对象上的toString()
将为您提供一个字符串键。检查我最近的更新。映射键相等然后使用对象引用,而不是值。正如您所说,处理字符串的方法是使用括号而不是gstring。谢谢尽管gstring似乎仍有一些奇怪之处,因为即使您保存它们并将它们用作对象,它也不起作用,请参阅带有“odd2”的更新问题(如果您愿意,您已经回答了这个问题的核心)
//String key as before, hence encouraged to use (t) instead of GStringImpl
def odd = [("$t".toString()): 1]
assert odd["$t"]
assert odd.test
assert odd["test"]
assert odd."$t"
//Equality by reference and by value in Groovy
assert "$t" == "test" //Value Equality == overridden in Groovy
assert !"$t".is("test") //Object Reference equality equivalent to == in Java