Двойная замена переменной Groovy GString

У меня есть скрипт Groovy. В Java через привязку я предоставляю:

binding.put( 'a','Hello')

Я запускаю скрипт через GroovyShell и делаю:

print "${a}"

будет печатать

Hello

Мне нужно print "${a}", где a может быть любым текстом в результате вызова другого метода. Просто напечатайте переменную, имя которой определяется во время выполнения. Как это возможно ?

Еще один пример для пояснения:

binding.put( 'm','n')
binding.put( 'n','p')

Распечатать ???? и вывод должен быть 'p', где 'm' известно в скрипте, но не 'n'


person DbSchema    schedule 22.07.2014    source источник
comment
Я не понимаю часть print ????.   -  person Will    schedule 22.07.2014
comment
У вас есть переменная, имя которой определяется во время выполнения и находится в привязке. Но в переплете может быть много всего. Как узнать, какую переменную вы хотите напечатать? Или я все неправильно понял...   -  person Will    schedule 22.07.2014
comment
??? означает, что я пропускаю конструкцию. Я думал, что мне нужно что-то вроде ${${m}}, но это не разрешено. Я знаю 'm', m указывает на привязку к n, n к p   -  person DbSchema    schedule 22.07.2014
comment
я не уверен, куда это идет, но, например. в groovysh вы можете получить доступ к контексту через this. так что это работает в groovysh: m='n'; n='p'; "${this."$m"}"   -  person cfrick    schedule 22.07.2014


Ответы (1)


Что-то вроде этого будет работать:

// Java code...

Binding binding = new Binding();
binding.setVariable("m", "n");
binding.setVariable("n", "result");

// here the script is hardcoded in this Java source
// file but could be read from anywhere...
String groovyScript = "evaluate \"println(${m})\"";

GroovyShell shell = new GroovyShell(binding);

// this will println "result"
shell.evaluate(groovyScript);

Надеюсь, это поможет.

person Jeff Scott Brown    schedule 22.07.2014