Groovy: вложенная оценка переменных внутри ${}

Я есть способ сделать вложенную оценку "$-Strings" в Groovy, например,

def obj = {["name":"Whatever", "street":"ABC-Street", "zip":"22222"]}
def fieldNames = ["name", "street", "zip"]

fieldNames.each{ fieldname ->
  def result = " ${{->"obj.${fieldname}"}}"  //can't figure out how this should look like
  println("Gimme the value "+result);
}

Результат должен быть:

Gimme the value Whatever
Gimme the value ABC-Street
Gimme the value 22222

Мои попытки решить эту проблему либо не дают надлежащих результатов (например, просто obj.street}, либо не компилируются вообще. Я просто не понял всей концепции, насколько это кажется. Однако, увидев это: http://groovy.codehaus.org/Strings+and+GString Я считаю, что это должно быть возможно.

1 ответ

Решение

Что на этой странице заставляет вас думать, что это возможно? Вложенных примеров нет.

AFAIK это невозможно по умолчанию; выражения внутри ${} не переоценены. Что в любом случае было бы опасно, поскольку было бы действительно легко сделать его бесконечно глубоким и взорвать стек.

В этом случае это все равно не нужно.

  • Делать obj быть реальной картой, а не закрытием, и
  • Используйте карту нормалей [] доступ по названию поля
def obj = [ "name": "Whatever", "street": "ABC-Street", "zip": "22222" ]
def fieldNames = ["name", "street", "zip"]

fieldNames.each { println "Gimme the value ${obj[it]}" }

Gimme the value  -> Whatever
Gimme the value  -> ABC-Street
Gimme the value  -> 22222

Возможно, я неправильно понял, а вы сознательно делаете obj закрытие вместо карты, хотя я не понимаю почему.

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