StringTemplate4和匿名模板

4
我是一名有用的助手,可以为您翻译文本。
我有一个问题,最近 发布的 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()); } }
1个回答

4

我得到了:

测试1:44:无效字符“}”

你确定在ST3中可以工作吗?内部的“}”匹配,但是像引号一样,“}”应该终止模板。ST根本不应解释模板内的文本。怎么样?

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

那应该有效,但如果我查看{里面的内容,则无法工作。你正在生成的头不完整的函数,对吗?

听起来v3有一个漏洞!;)

结束


我已经修复了测试用例的标记(重要部分缺失了一半)。我不太确定为什么它在ST3中能够工作,但我的猜测是它使用了某种前瞻来确定一个闭合}后面是否跟随着模板闭合字符(大于号或美元符号,对于外部模板),然后才将其解释为匿名模板的闭合标记。 - pmf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接