Groovy — GString используется в качестве ключа, а String — в качестве ключа, нотация индекса и метод put

В документации по 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()? Возможно, нотация нижнего индекса имеет какое-то неявное приведение к строке?


person solstice333    schedule 01.02.2017    source источник


Ответы (1)


Имеет ли нотация нижнего индекса неявное приведение к строке?

В основном, да.

Оператор a[b] = c эквивалентен вызову метода a.putAt(b, c) согласно перегрузке оператора в Groovy. правила.

Конкретная подпись метод putAt имеет значение void putAt(String property, Object newValue), что означает, что если b является строкой Groovy, она сначала будет преобразована в строку с использованием метода toString().

В конечном итоге метод putAt вызовет Map.put, используя значение String в качестве ключа.

person bdkosher    schedule 02.02.2017
comment
Я не понимаю проблемы с использованием GString в качестве ключа карты с обозначением нижнего индекса. Преобразование в String - это, вероятно, то, что хотелось бы в любом случае. Вместо этого документация Groovy должна предостерегать от использования методов get и put из Map. - person wheeler; 13.02.2021