Groovy变量双重替换

时间:2019-01-11 16:44:29

标签: grails groovy groovyshell groovy-console

我想执行双重替换

打印时:

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

它打印:

Hello ${x}

当我希望打印Hello World时,我尝试执行双重评估${${}},将其转换为org.codehaus.groovy.runtime.GStringImpl,并进行一次绝望的${y.toStrin()}

编辑:

更清楚地说,我的意思是这个,但是在Groovy中:

为什么要这么做?:因为我们有一些文本文件需要使用常规变量进行评估;这些变量很多并且代码的不同部分是不同的,所以我想有一个适用于所有情况的解决方案,而不必每次都绑定每个变量,而不必添加很多代码行

2 个答案:

答案 0 :(得分:1)

因此,您使用的是$的转义,因此它将被解释为字符串。

对于您想要做的事情,我将研究Groovys的模板引擎: http://docs.groovy-lang.org/docs/next/html/documentation/template-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()

但这是我能想到的最接近的东西,可能会导致您遇到某些事情……

答案 1 :(得分:1)

如果我理解正确,那么您正在从其他地方阅读y。因此,您要在y之后再加载y之后将x评估为GString。 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