私の .stg ファイルには 2 つのテンプレートがあり、どちらも複数値の HashMap に適用されます。注入されたオブジェクトとして HashMap が使用されます。
そして、何度も注入できる HashMap のインスタンスが必要です。
私の問題は、別のテンプレートに切り替えると、ANTLR が 2 番目の HashMap をリスト (複数のオブジェクトと null 値) と見なすように見えることです。
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 を同じテンプレートのままにして、そのまま BAR を FOO に置き換えると、出力は次のようになります。
bar: Russell @ German
bar: Russell @ German
ドキュメントでは、「org.stringtemplate.v4.STにSTを同期して追加(文字列名、オブジェクト値)」と述べています:
「リストを送信してから単一の値要素を挿入すると、add() は元のリストをコピーして新しい値を追加します。」
ハッシュマップはどうですか?StringTemplate は、HashMap、キーと値のペア アクセス、意図的にオブジェクト、リストおよび誤って注入された複数値と見なしますか?