Groovy - 将值附加到字符串中的变量

时间:2016-09-01 13:26:22

标签: grails groovy

让我们假设我有一个名为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)

我得到的输出是:

  

结果:产品

3 个答案:

答案 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后立即进行评估,因为Stringname。实际值将取决于代码执行时范围内的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']
}