我试图提取字符串的一部分,并检查它是否存在于字符串数组中。如果我使用字符串插值(或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 :|
1条答案
按热度按时间9rbhqvlz1#
实际上,这个问题与字符串长度无关。如果没有修剪,这将产生
true
:问题是
in
运算符使用equals
进行比较,而GString
的equals
并不像您所期望的那样工作。将这些行添加到代码中:它将产生:
为什么会这样呢?我不知道,但我喜欢我引用的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中的全部讨论。我希望它能帮助你理解正在发生的事情。