Groovy - GString 用作键与 String 作为键,下标符号与 put 方法
Groovy - GString being used as key versus String as key, subscript notation versus put method
在 groovy documentation 中提到使用 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
相当于调用 a.putAt(b, c)
方法,按照 Groovy operator overloading 规则。
putAt
method的具体签名是void putAt(String property, Object newValue)
,这意味着如果b
是一个Groovy字符串,它会首先使用其转换为字符串toString()
方法。
最终,putAt
方法将使用 String
值作为键调用 Map.put
。
在 groovy documentation 中提到使用 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
相当于调用 a.putAt(b, c)
方法,按照 Groovy operator overloading 规则。
putAt
method的具体签名是void putAt(String property, Object newValue)
,这意味着如果b
是一个Groovy字符串,它会首先使用其转换为字符串toString()
方法。
最终,putAt
方法将使用 String
值作为键调用 Map.put
。