我对最近发布的 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()); } }