【问题标题】:Groovy - Append values to variables in a stringGroovy - 将值附加到字符串中的变量
【发布时间】:2017-01-09 09:56:09
【问题描述】:

假设我有一个名为 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”打印为“Hello foo”。我得到的是“你好 ${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)

我得到的输出是:

结果:产品产品

【问题讨论】:

  • 可能是因为您应该使用 messages.properties 和 gsps 来呈现模板,而不是使用 db 作为模板 :)
  • 感谢您的回复。这是我知道的解决方案。但我特别想将上述作为一个用例来实现。
  • 你确定你有new Template(subject:"Hello ${name}")而不是new Template(subject:'Hello ${name}')吗?双引号很重要。您描述的行为没有意义,几乎是不可能的。
  • 杰夫。抱歉,我错过了这条评论。是的。这是一个单引号。对于由于单引号引起的误导,我深表歉意。

标签: grails groovy


【解决方案1】:
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
}

【讨论】:

  • 我使用 GStringTemplateEngine 让它工作。谢谢弗拉基米尔。对于围绕这个问题的所有困惑,我们深表歉意。 :)
【解决方案2】:

显示的代码有几处错误。你有这个:

class Template{
    String subject
    ...
}

那么你有这个:

Template t=new Template(subject:"Hello ${name}").save()

分配给subject 属性的Groovy 字符串将在您将其分配给subject 后立即进行评估,因为subjectString。实际值将取决于代码执行时范围内的name 属性的值。

稍后你有这个:

def render(Long id){
    String name="foo"
    Template t= Template.get(id)
    println t.subject
}

您似乎希望将本地name 属性替换为已分配给t.subject 的Groovy 字符串,但这不是Groovy 的工作方式。 t.subject 不是 Groovy 字符串。这是一个String

除此之外,您评论说当您println t.subject 时输出为"Hello ${name}"。我不认为这是可能的,但如果这是你所看到的,那么我猜它是。

【讨论】:

  • 好吧,是的,杰夫,这是有道理的。它不是 Groovy 字符串。它是一个字符串。那么这个String是否可以转换为Groovy String,从而将变量“name”的值替换为变量名呢?
  • 是的,但这是一个坏主意,并且会依赖于一个有点复杂的解决方案。一个更好的想法是引入一个动态属性,或者根据细节,可能只是有一个接受变量作为参数并返回包含该变量的字符串的方法。
  • 我同意杰夫。那将是一个更简单的解决方案。如果我能打那个电话就好了。无论如何,我让它与弗拉基米尔使用“GStringTemplateEngine”的解决方案一起工作。
【解决方案3】:

您可以使用transient 属性来模拟所需的行为:

class Template{
  String subject
  String getSubjectPretty(){ "Hello $subject" }
  static transients = ['subjectPretty']
}

那么你可以使用:

println Template.get(1).subjectPretty

【讨论】:

  • 在他的代码示例中,他试图以某种方式将不同范围内的变量插入description 的值中。这与您所表达的情况不同。
  • @JeffScottBrown 他的render() 代码确实有误导性:String name="foo" 属于保存块。我想,你关于单引号的观点会解决这个问题,但也许他还有别的问题......
  • 对。这很难说。问题中有几处没有意义。
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2014-02-17
  • 2012-09-09
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多