Groovy переменная двойное замещение - PullRequest
0 голосов
/ 11 января 2019

Я хотел бы выполнить двойное замещение .

При печати:

def y    = "\${x}"
def x    = "world"
def z    = "Hello ${y}"
println z

Он печатает:

Hello ${x}

Когда я хотел, чтобы он напечатал Hello World, я попытался выполнить двойную оценку ${${}}, приведя ее к org.codehaus.groovy.runtime.GStringImpl и отчаявшись ${y.toStrin()}

Edit:

Чтобы быть более понятным, я имею в виду это, но в Groovy:

( Зачем я это делаю? : поскольку у нас есть несколько текстовых файлов, которые нам нужно оценить с помощью groovy-переменных; переменных много, а в разных частях кода они разные, поэтому я бы хотел иметь решение, работающее во всех случаях, не связывать каждый раз каждую переменную, не добавляя много строк кода)

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Если я правильно понимаю, вы читаете y откуда-то еще. Итак, вы хотите оценить y как GString после y и затем x были загружены. groovy.util.Eval сделает это для простых случаев. В этом случае у вас есть только одна переменная привязки: x.

def y = '${x}'
def x = 'world'

def script = "Hello ${y}"
def z = Eval.me('x', x, '"' + script + '".toString()') // create a new GString expression from the string value of "script" and evaluate it to interpolate the value of "x"
println z
0 голосов
/ 11 января 2019

Итак, с тем, что у вас есть, вы избегаете $, поэтому он просто интерпретируется как строка.

Для того, что вы хотите сделать, я бы посмотрел на движки шаблонов Groovys: http://docs.groovy -lang.org / документы / следующий / HTML / документация / шаблон-engines.html

Прочитав ваш комментарий, я поиграл с несколькими идеями и придумал этот надуманный ответ, который, вероятно, тоже не совсем то, что вы ищете:

import groovy.lang.GroovyShell

class test{
    String x = "world"
    String y = "\${x}"
    void function(){
        GroovyShell shell = new GroovyShell();
        Closure c = shell.evaluate("""{->"Hello $y"}""")
        c.delegate = this
        c.resolveStrategry = Closure.DELEGATE_FIRST
        String z = c.call()
        println z
    }
}

new test().function()

Но это было самое близкое, что я мог придумать, и может привести вас к чему-то ...

...