0

我想执行双重替换

打印时:

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

它打印:

Hello ${x}

当我想打印它时Hello World,我尝试执行双重评估${${}},将其强制转换org.codehaus.groovy.runtime.GStringImpl${y.toStrin()}

编辑:

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

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

4

2 回答 2

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()

但这是我能想到的最接近的东西,可能会引导你找到一些东西......

于 2019-01-11T18:51:39.420 回答
1

如果我理解正确,您正在y从其他地方阅读。所以你想在加载 之后评估y为 GString 。对于简单的情况会这样做。在这种情况下,您只有一个绑定变量:.yxgroovy.util.Evalx

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
于 2019-01-12T15:37:50.400 回答