Я очень новичок в 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)"
}
Обратите внимание, что после добавления "p2" в шаблон "modified" он также изменяет "myCurTemplate"... Может быть, я неправильно спроектировал шаблон (или неадекватно?), но есть ли способ сделать это, не изменяя шаблон? оригинальный "myCurTemplate"??
То есть, могу ли я каким-то образом сделать реальную копию атрибута «аргументы» myCurTemplate без его изменения будущими дополнениями к другим экземплярам шаблона? Я просмотрел методы и 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)"
Я могу без проблем изменить «атрибут реализации», но по-прежнему сталкиваюсь с проблемами со списками аргументов длины > 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)