让我们假设我有一个名为Template的域类,看起来有点像这样:
class Template{
String subject
...
}
我保存了这个类的实例:
Template t=new Template(subject:'Hello ${name}').save()
现在,我在方法中获取此实例,如下所示:
def render(Long id){
String name='foo'
Template t= Template.get(id)
println t.subject
}
我想要" println t.subject"打印为"你好foo"。我得到的是#34; Hello $ {name}"。 我希望t.subject动态替换变量名的值 - " foo"取代$ {name}。
这可以在groovy中实现吗? 我找不到任何关于如何做到这一点的文档,或者为什么不能这样做。
更新
我在GroovyConsole上试过这个。
class Entity{
String name
}
class Template{
String name
String subject
}
String renderTemplate(Template template, Entity entity){
return template.subject
}
Entity e = new Entity(name:'product')
Template template=new Template(name:'emailTemplate',subject:'Product ${e.name}')
renderTemplate(template,e)
我得到的输出是:
结果:产品
答案 0 :(得分:2)
class Template {
String subject
// ...
}
Template t = new Template(subject: 'Hello, ${name}').save()
重要提示:在' Hello,$ {name}'中使用单引号或者你会收到错误。
def render(Long id) {
String name = "world"
Template t = Template.get(id)
def engine = new groovy.text.GStringTemplateEngine()
def subject = engine
.createTemplate(t.subject)
.make(name: name)
println subject
}
答案 1 :(得分:0)
显示的代码存在一些问题。你有这个:
class Template{
String subject
...
}
然后你有这个:
Template t=new Template(subject:"Hello ${name}").save()
分配给subject
属性的Groovy字符串将在您subject
分配给subject
后立即进行评估,因为String
是name
。实际值将取决于代码执行时范围内的def render(Long id){
String name="foo"
Template t= Template.get(id)
println t.subject
}
属性的值。
后来你有了这个:
name
看起来您希望将本地t.subject
属性替换为已分配给t.subject
的Groovy字符串,但这不是Groovy的工作方式。 String
不是Groovy字符串。这是println t.subject
。
当您"Hello ${name}"
输出为@echo off
mode con:cols=55 lines=8
for /f "skip=1" %%p in ('wmic os get freephysicalmemory') do (set m=%%p
goto :done)
:done
set /a FreeMem = %m%/1000
if %FreeMem% LEQ "900"( goto :error ) ELSE ( goto :go )
:go
COLOR 2F
echo Hi %username%!
echo Remaining Free Memory is ---%FreeMem% MB---
echo It's safe to go ahead!
goto :cont
:error
COLOR 4F
echo Hey %username%!
echo Remaining Free Memory is ONLY --- %FreeMem% MB---
echo It's not safe to go ahead!
goto :ask
:ask
echo Do you want me to open Task Manager for you? (y/n)
set INPUT=
set /p INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto :yes
If /I "%INPUT%" =="n" goto :no
echo Incorrect Input & goto :ask
:yes
TASKMGR
goto cont
:no
echo AS you Wish!
goto cont
:cont
pause
时,请注释。我不认为这是可能的,但如果这就是你所看到的,那我想是的。
答案 2 :(得分:0)
您可以使用div{position:relative}
属性来模拟所需的行为:
transient
然后你可以使用:
class Template{
String subject
String getSubjectPretty(){ "Hello $subject" }
static transients = ['subjectPretty']
}