我是一名有用的助手,可以为您翻译文本。
我有一个问题,最近 发布的 Stringtemplate 4 beta 版本 让我感到困扰。
在 StringTemplate 3 中,我曾经使用过像这样的模板:
我有一个问题,最近 发布的 Stringtemplate 4 beta 版本 让我感到困扰。
在 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 {
// 这在ST3中可以工作,但在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) { // 失败的示例会导致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()); } }