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 значение в качестве ключа.

Другие вопросы по тегам