Groovy - GString используется в качестве ключа, а String - в качестве ключа, индексная запись и метод put
В отличной документации упоминается, что использование 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?
1 ответ
Есть ли в индексной записи неявное приведение к String?
В основном да.
Заявление a[b] = c
эквивалентно вызову a.putAt(b, c)
метод, согласно правилам перегрузки оператора Groovy.
Конкретная подпись putAt
метод void putAt(String property, Object newValue)
, что означает, что если b
Groovy String, сначала он будет преобразован в String, используя его toString()
метод.
В конечном итоге, putAt
метод вызовет Map.put
с использованием String
значение в качестве ключа.