我对stringtemplate非常陌生,并且正在为语言翻译项目进行实验。
无论如何,我已经定义了一个包含以下模板的Java组文件:
instantiation(realization, arguments) ::=
<<new <realization>(<arguments; separator = ", ">)>>
但是,我正在努力解决以下问题:
private StringTemplate myCurTemplate;
public void foo() {
myCurTemplate = myGroups.getInstanceOf("instantiation");
myCurTemplate.setAttribute("realization", "test");
myCurTemplate.setAttribute("arguments", "p0");
myCurTemplate.setAttribute("arguments", "p1");
System.out.println("Starting: " + myCurTemplate); // "new test(p0, p1)"
}
public void bar() {
StringTemplate modified = myGroups.getInstanceOf("instantiation");
modified.setAttribute("realization", "anotherTest");
modified.setAttribute("arguments", myCurTemplate.getAttribute("arguments"));
System.out.println("Modified: " + modified); // "new anotherTest(p0, p1)"
modified.setAttribute("arguments", "p2");
System.out.println("Modified: " + modified); // as expected, "new anotherTest(p0, p1, p2)"
System.out.println("Original: " + myCurTemplate); // "new test(p0, p1, p2)"
}
注意添加&#34; p2&#34;到模板,&#34;修改&#34;,它也改变&#34; myCurTemplate&#34; ... 也许我设计的模板不正确(或不充分?),但是有一些方法可以做到这一点,而无需修改原版&#34; myCurTemplate&#34; ??
也就是说,我可以以某种方式制作myCurTemplate&#34; s&#34;#34;的真实副本。属性没有被未来添加到其他模板实例修改?我没有太多运气就查看了这些方法和api文档 - 我有一种感觉,我只是尝试做一些通常不会做的事情,或者需要使用stringtemplate。
修改 所以我在ST4中对此进行了一些处理,并想出了这段代码:
ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");
x.add("arguments", "p1");
ST y = new ST(x);
y.remove("realization");
y.add("realization", "Another");
y.add("arguments", "p6");
print x.render(); // "new Realiz(p0, p1, p6)"
print y.render(); // "new Another(p0, p1, p6)"
我可以毫无困难地修改&#34;实现属性,但是仍然会遇到长度为&gt;的参数列表的问题。 1.例如,如果我将x中的参数列表定义为仅一个元素,那么在y中修改它将两者分开 - 根据需要(可能因为它们在复制时都得到一个单独的引用?)例如:
ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");
ST y = new ST(x);
y.remove("realization");
y.add("realization", "Another");
y.add("arguments", "p6");
y.add("arguments", "p3");
print x.render(); // "new Realiz(p0)"
print y.render(); // "new Realiz(p0, p6, p3)" (like I would expect)
答案 0 :(得分:0)
(按现在我假设你的意思是myCurTemplate)。嗯......似乎我没有在getAttribute()中复制,也没有警告你不要修改。所以...不要修改它。 ;)它正在从myCurTemplate中提取支持列表并推送到修改过的。首先克隆这些元素。