在时髦的文档中,它提到使用GString作为密钥是不好的:
def key = 'some key'
def map = [:]
def gstringKey = "${key.toUpperCase()}"
map.put(gstringKey,'value')
assert map.get('SOME KEY') == null
但是,只需将 put() 方法更改为使用下标表示法:
def key = 'some key'
def map = [:]
def gstringKey = "${key.toUpperCase()}"
map[gstringKey] = 'value' // here
assert map.get('SOME KEY') == null
足以导致断言失败。使用 [] 和 put() 方法之间的语义有何不同?下标表示法是否对字符串有某种隐式强制转换?
下标表示法是否隐式强制转换为字符串?
基本上,是的。
语句 a[b] = c
等效于根据 Groovy 运算符重载规则调用 a.putAt(b, c)
方法。
putAt
方法的特定签名是 void putAt(String property, Object newValue)
,这意味着如果b
是 Groovy 字符串,它将首先使用其 toString()
方法转换为字符串。
最终,putAt
方法将使用 String
值作为键调用Map.put
。