我想从数据库中读取一个String,并通过将其转换为GString来替换占位符。我可以用Eval做到这一点吗?还有其他想法吗?
String stringFromDatabase = 'Hello ${name}!'
String name = 'world'
assert 'Hello world!'== TODO
答案 0 :(得分:14)
您可以在Groovy中使用Template框架,因此这样做可以解决您的问题:
String stringFromDatabase = 'Hello ${name}!'
String name = 'world'
def engine = new groovy.text.SimpleTemplateEngine()
assert 'Hello world!'== engine.createTemplate(stringFromDatabase).make([name:name]).toString()
您可以在此处找到文档:http://docs.groovy-lang.org/latest/html/documentation/template-engines.html#_introduction
GString类是抽象的,抽象类的GStringImpl实现在字符串数组上工作,它从解析阶段和值中获得。
答案 1 :(得分:1)
如果你想使用占位符,你应该使用双引号字符串文字。
以下内容应该有效:
String name = 'world'
String stringFromDatabase = "Hello ${name}!" //use double quotes
assert 'Hello world!' == stringFromDatabase
请参阅official Groovy documentation about Strings,了解其他可行的方法。
答案 2 :(得分:1)
我用Eval解决了这个问题:
String stringFromDatabase = 'Hello ${name}!'
String name = 'world'
assert 'Hello world!' == Eval.me('name', name, '"' + stringFromDatabase + '"')
答案 3 :(得分:0)
这也使用模板作为 Jacob 的答案,但尝试从当前变量解析绑定。如果您不知道要替换的值,则很有用:
String stringFromDatabase = 'Hello ${name}!'
// variables w/o type or def keyword end up in this.binding.variables
name = 'world'
def engine = new groovy.text.SimpleTemplateEngine()
assert 'Hello world!'== engine.createTemplate(stringFromDatabase).make(this.binding.variables).toString()
CAVEAT:可以替换的变量没有 type 或 def 关键字。