StringTemplate4和匿名模板

时间:2011-01-18 19:47:29

标签: java stringtemplate stringtemplate-4

我对最近的released beta version of Stringtemplate 4感到有疑问。

在StringTemplate 3中,我曾经有像

这样的模板
<env_vars:{ var | void* <var>() { return null; }}>

即。包含文字右大括号(“}”)的匿名模板,这些在ST3中运行良好,而不会逃脱第一个右大括号。

使用ST4,我得到一个NPE(下面的测试用例打印堆栈跟踪)。我可以通过转义关闭的文字括号来使它工作,所以模板看起来像这样(注意第一个右括号前面的引用反斜杠):

<env_vars:{ var | void* <var>() { return null; \}}>

但它看起来有点难看;我一直很欣赏ST的非侵入式语法,并且必须将每个“{”与相应的“\}”相匹配,以某种方式看起来非常不对称。

我是否缺少某些东西,或者这是ST3行为的预期变化?

测试用例:

import org.stringtemplate.v4.ST;

public class ST4Test
{
  public static void main(final String[] args)
  {
    final String[] env_vars = new String[]{"one", "two", "three"};

    try
    {

      // This used to work in ST3, but fails in ST4.
      final ST failingST = new ST("<env_vars:{ var | void* <var>() { return null; }}\n>");
      failingST.add("env_vars", env_vars);

      System.out.printf("%s\n", failingST.render());
    }
    catch (Exception ex)
    {
      // The failing example results in a NPE
      ex.printStackTrace();
    }

    // This works, but requires quoting the "}" contained within the anonymous
    // template, which I find a bit disturbing, considering that I use ST for
    // generating C-code, which tends to use the occasional "}", along with the
    // fact that this used to work in ST3.
    final ST workingST = new ST("<env_vars:{ var | void* <var>() { return null; \\}\n}>");
    workingST.add("env_vars", env_vars);
    System.out.printf("%s\n", workingST.render());
  }
}

1 个答案:

答案 0 :(得分:4)

我得到了

测试1:44:无效字符&#39;}&#39;

您确定在ST3中有效吗?内部}匹配但是,与引号一样,第一个}应该终止模板。 ST根本不应该解释模板内的文本。怎么样?

<env_vars:{ var | void* <var>() {{{{{{{{{{{ return null; }>

这应该有用,但如果我看着{里面的话,那就不行了。它可能是你没有完成的头脑,对吧?

听起来像v3有一个错误! ;)

泰尔