我的 .stg 文件中有两个模板,它们都适用于多值 HashMap。HashMap 被用作注入对象。
而且我需要那些可以多次注入的HashMap实例。
我的麻烦是,当我切换到另一个模板时,ANTLR 似乎将第二个 HashMap 视为一个列表——多对象和空值。
Part of my .stg file shows as follows:
tpl_hash(BAR, FOO) ::= <<
<FOO:foo(); separator="\n">
<BAR:bar(); separator="\n">
>>
foo(nn) ::= <<
foo: <nn.name; null="NULL"> . <nn.national; null="NULL">
>>
bar(mm) ::= <<
bar: <mm.name> @ <mm.national>
>>
我的 .g 文件的一部分显示:
HashMap hm = new HashMap();
hm.put("name", $name.text);
hm.put("national", "German");
tpl_hash.add("FOO",new HashMap(hm));
HashMap hm2 = new HashMap();
hm2.put("name", $name.text);
hm2.put("national", "German");
tpl_hash.add("BAR",new HashMap(hm2));
我期望的结果是:
bar: Kant @ German
foo: Russell @ England
但是,我得到了:
foo: NULL . NULL
foo: NULL . NULL
bar: @
bar: @
如果我们用 FOO 替换 BAR,保持 FOO 和 BAR 使用相同的模板,输出是正确的,如下所示。
bar: Russell @ German
bar: Russell @ German
在文档中,“org.stringtemplate.v4.ST 中的同步 ST 添加(字符串名称,对象值)”说:
“如果您发送一个列表,然后注入单个值元素,add() 会复制原始列表并添加新值。”
HashMap 呢?StringTemplate 是否故意将 HashMap、键/值对访问、对象视为 List 和误注入的多值?