5

groovy 文档中,它提到使用 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() 方法的语义有何不同?下标符号是否可能对 String 有某种隐式强制转换?

4

1 回答 1

6

下标符号是否隐式转换为字符串?

基本上,是的。

根据Groovy运算符重载规则,该语句a[b] = c等效于调用方法。a.putAt(b, c)

putAt方法的具体签名是void putAt(String property, Object newValue),这意味着如果b是 Groovy 字符串,它将首先使用其toString()方法转换为字符串。

最终,该putAt方法将Map.put使用该String值作为键调用。

于 2017-02-02T04:56:03.303 回答