1

我的 .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 和误注入的多值?

4

1 回答 1

1

您的问题是您将 foo / bar 模板应用于地图中的每个项目,而不是地图本身。

考虑以下数据结构:

{
  "FOO": {
    "name": "Nick",
    "national":"German"
  },
  "BAR": {
    "name": "Karl",
    "national":"French"
  },
  "FIZZBUZZ": [
    {
      "name": "Kitty",
      "national":"English"
    },
    {
      "name": "Dan",
      "national":"Finnish"
    }
  ]
}

(假设您已将 FOO 设置为结果地图、FIZZBUZZ 等)。

并想象以下模板:

group blank;
main()::=<<
$foo(nn=FOO)$
$bar(mm=BAR)$

$! This is wrong because it applies foo to each element of the map!$
$FOO:foo(); separator = "\n"$

$! This is right because each element of baz is itself a map! !$
$FIZZBUZZ:foo(); separator = "\n"$
$FIZZBUZZ:bar(); separator = "\n"$
>>

foo(nn) ::= <<
foo: $nn.name; null="NULL"$ . $nn.national; null="NULL"$
>>


bar(mm) ::= <<
bar: $mm.name$ @ $mm.national$
>>

您将获得以下输出:

foo: Nick . German
bar: Karl @ French

foo: NULL . NULL
foo: NULL . NULL

foo: Kitty . English
foo: Dan . Finnish
bar: Kitty @ English
bar: Dan @ Finnish

所以只要把你的电话FOO:foo()foo(nn=FOO)

我使用我开发的小 StringTemplate 应用程序引擎项目 (http://stringtemplate.appspot.com/) 来测试它;我认为它不是使用 4.0 版而是 3.2 版,但应该非常相似。

于 2012-01-15T02:53:55.970 回答