Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么groovy map键求值在使用GString时在类似情况下表现不同?_Groovy - Fatal编程技术网

为什么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