我对最近的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()); } }
答案 0 :(得分:4)
我得到了
测试1:44:无效字符&#39;}&#39;
您确定在ST3中有效吗?内部}匹配但是,与引号一样,第一个}应该终止模板。 ST根本不应该解释模板内的文本。怎么样?
<env_vars:{ var | void* <var>() {{{{{{{{{{{ return null; }>
这应该有用,但如果我看着{里面的话,那就不行了。它可能是你没有完成的头脑,对吧?
听起来像v3有一个错误! ;)
泰尔