1

私の .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、キーと値のペア アクセス、意図的にオブジェクト、リストおよび誤って注入された複数値と見なしますか?

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 に答える