Карта возвращает ноль при получении значения на основе имени ключа - PullRequest
0 голосов
/ 28 февраля 2019

У меня очень странная проблема с получением значений из LinkedHashMap в Grovvy при запуске в конвейере Jenkins.

У меня есть такая карта: map = ['key1': 'param1']

Теперь я хочу получитьзначение key1, поэтому я называю map.get('key1') или map['key1'].Удивительно, но оба они возвращают null.

Когда я пытаюсь позвонить map.keySet(), он возвращает key1.И что самое интересное, когда я звоню map.get(map.keySet()[0]), он возвращает param1, как и ожидалось.

Так как же получается, что прямой map.get('key1') не работает?

ОБНОВЛЕНИЕ:

После некоторого расследования я обнаружил, что key1 это не строка, а org.codehaus.groovy.runtime.GStringImpl.Кто-нибудь знает, почему он был приведен к этому классу, а не к String?

Вот как создается исходная карта:

result = ["${key}": value]

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

GStrings (groovy.lang.GString), которые также называют интерполированными строками в других языках программирования."${key}" - это строка GString, но "${key}".toString() - это строка.Более подробно на здесь

Следующий подход может решить вашу проблему

def key = 'key1'
def a = "${key}"  // or a = "${key}".toString()
def result = [:]
result[a] = 'param1'
println result.key1 // or result['key1']
0 голосов
/ 28 февраля 2019

Следующий код работает.

map = ['key1': 'param1']
assert 'param1' == map['key1']

После обновления в вопросе

Ключ на самом деле не был строкой.toString() выдаст вам строку как String, которую можно использовать в качестве ключа

...