gpt4 book ai didi

java - Stringtemplate:是否可以将HashMap使用的模板应用于多值属性

转载 作者:太空宇宙 更新时间:2023-11-04 08:27:00 28 4
gpt4 key购买 nike

我的 .stg 文件中有两个模板,它们都适用于多值 HashMap。 HashMap 被用作注入(inject)对象。

我需要那些可以多次注入(inject)的 HashMap 实例。

我的问题是,当我切换到另一个模板时,ANTLR似乎将第二个 HashMap 视为一个 List —— 多个对象和 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,保持 FOO 和 BAR 相同模板,输出是正确的,如下所示。

bar: Russell @ German
bar: Russell @ German
<小时/>

在文档中,“同步ST添加(字符串名称,对象值)在org.stringtemplate.v4.ST”说:

“如果您发送一个列表,然后注入(inject)一个值元素,add()复制原始列表并添加新值。”

HashMap 怎么样? StringTemplate是否考虑HashMap、键/值对访问,一个有意的对象,作为列表和由注入(inject)的多值错误?

最佳答案

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

考虑以下数据结构:

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

(假设您已将 FOO 设置为结果 map 、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 版本,但应该非常相似。

关于java - Stringtemplate:是否可以将HashMap使用的模板应用于多值属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com