我想执行双重替换。
打印时:
def y = "\${x}"
def x = "world"
def z = "Hello ${y}"
println z
它打印:
Hello ${x}
当我希望打印Hello World
时,我尝试执行双重评估${${}}
,将其转换为org.codehaus.groovy.runtime.GStringImpl
,并进行一次绝望的${y.toStrin()
}
编辑:
更清楚地说,我的意思是这个,但是在Groovy中:
(为什么要这么做?:因为我们有一些文本文件需要使用常规变量进行评估;这些变量很多并且代码的不同部分是不同的,所以我想有一个适用于所有情况的解决方案,而不必每次都绑定每个变量,而不必添加很多代码行
答案 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