4

我对最近发布的 Stringtemplate 4 测试版有疑问

在 StringTemplate 3 中,我曾经有过类似的模板

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

即包含文字右大括号(“}”)的匿名模板,这些模板在 ST3 中运行良好,无需转义第一个右大括号。

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

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

但这似乎有点难看;我一直很欣赏 ST 的非侵入式语法,并且必须将要输出的每个“{”与相应的“\}”相匹配,这似乎非常不对称。

是否有我遗漏的东西,或者这是 ST3 的预期行为变化?

测试用例:

导入 org.stringtemplate.v4.ST;

公共课 ST4Test
{
  公共静态无效主要(最终字符串 [] 参数)
  {
    final String[] env_vars = new String[]{"one", "two", "three"};

    尝试
    {

      // 这曾经在 ST3 中工作,但在 ST4 中失败。
      最终 ST 失败ST = new ST("<env_vars:{ var | void* <var>() { return null; }}\n>");
      失败ST.add("env_vars", env_vars);

      System.out.printf("%s\n", failedST.render());
    }
    捕捉(例外前)
    {
      // 失败的例子导致 NPE
      ex.printStackTrace();
    }

    // 这可行,但需要引用匿名中包含的“}”
    // 模板,我觉得有点令人不安,考虑到我使用 ST
    // 生成 C 代码,它倾向于使用偶尔的“}”,以及
    // 事实上,这曾经在 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());
  }
}
4

1 回答 1

4

我明白了

测试 1:44:无效字符 '}'

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

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

那应该可以,但是如果我在里面看 { 就不行了。它可能是你正在生成的头部不完整的功能,对吗?

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

于 2011-01-19T18:58:49.693 回答