Groovy中的字符串插值:当字符串在定义插值变量之前已经定义好了。

3

我有一个类似于这个问题的问题:

在运行时只知道值的情况下使用Groovy字符串插值

如何使以下内容有效:

def message = 'Today is ${date}, your id is: ${id}';
def date1 = '03/29/2019'
def id1 = '12345'
def result = {date, id -> "${message}"}
println(result(date1, id1))

我想要处理一个已在其他地方定义的字符串(为了简化,我在此将其定义为“message”),其中包含已嵌入${date}和${id}的插值,并在此处使用闭包进行处理,并定义输入字段。

我尝试过多次更改,例如在不使用"${}"的情况下在闭包中定义message,使用单引号或双引号,在字符串'message'中嵌入双引号等等,但我总是得到以下结果:

Today is ${date}, your id is: ${id}

但是我希望它能够表达:

Today is 03/29/2019, your id is: 12345

以下方法可行,但我不确定它是否是最好的方式:
def message = '"Today is ${date}, your id is: ${id}"'
def sharedData = new Binding()                          
def shell = new GroovyShell(sharedData)                 
sharedData.setProperty('date', '03/29/2019')     
sharedData.setProperty('id', '12345')
println(shell.evaluate(message))

http://docs.groovy-lang.org/latest/html/documentation/guide-integrating.html


2
我不是很确定,但我认为简单模板引擎可能是一个更轻量级的方法。 - ernest_k
1个回答

3

ernest_k是正确的,你可以使用模板引擎来实现这个:

import groovy.text.SimpleTemplateEngine

def templatedMessage = new SimpleTemplateEngine().createTemplate('Today is ${date}, your id is: ${id}')

def date1 = '03/29/2019'
def id1 = '12345'

def result = { date, id -> templatedMessage.make(date: date, id: id)}
println(result(date1, id1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接