Groovy:在String集合中找不到GString

k4emjkb1  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(128)

我试图提取字符串的一部分,并检查它是否存在于字符串数组中。如果我使用字符串插值(或GStrings),它会给出奇怪的结果。

def str = "app-dev"

def env = str.split('-')[1]
println(env + " length: " + env.length()) // prints dev length: 3
println(env in ['dev', 'qa']) // prints true, works as expected.

def _env = "${str.split('-')[1]}" // string interpolation or GString
println(_env + " length: " + _env.length()) // prints dev length: 3
println(_env in ['dev', 'qa']) // prints false, why ?
println(_env.trim() in ['dev', 'qa']) // prints true :|
9rbhqvlz

9rbhqvlz1#

实际上,这个问题与字符串长度无关。如果没有修剪,这将产生true

println(_env.toString() in ['dev', 'qa']) // prints true :|

问题是in运算符使用equals进行比较,而GStringequals并不像您所期望的那样工作。将这些行添加到代码中:

println _env == 'dev'
println _env.equals('dev')

它将产生:

true
false

为什么会这样呢?我不知道,但我喜欢我引用的here解释:
显然,equals的GStringImpl实现可以这样编写,当它传递一个包含与this相同字符的String时,它返回true。我猜它没有这样写的原因是因为它会违反equals契约,该契约规定:
它是对称的:对于任何非空引用值x和y,x.equals(y)应该返回true当且仅当y.equals(x)返回true。
当传递GSStringImpl时,String.equals(Object other)的实现将始终返回false,因此如果GStringImpl.equals(Object other)在传递任何String时返回true,则将违反对称要求。
查看question中的全部讨论。我希望它能帮助你理解正在发生的事情。

相关问题