最近、released beta version of Stringtemplate 4に問題があります。 StringTemplate 3においてStringTemplate4と匿名テンプレート
は、Iリテラル閉じ括弧を含む
<env_vars:{ var | void* <var>() { return null; }}>
すなわち匿名テンプレート(「}」)のようなテンプレートを持って使用され、これらは最初の閉じ括弧をエスケープすることなく、ST3に十分働きました。
ST4では、NPEを取得しています(以下のテストケースはスタックトレースを出力します)。テンプレートが(最初の閉じ括弧の前で引用バックスラッシュに注意)次のようになりますので、私は、それが閉じリテラル中括弧をエスケープすることにより、仕事を得ることができます:
<env_vars:{ var | void* <var>() { return null; \}}>
をしかし、それは少し醜いようです。私はいつもSTの非侵入構文を賞賛しており、それぞれの "{"を対応する "\}"に出力するように一致させなければならないのは、非常に非対称的なようです。
私は行方不明のものがあるのでしょうか、これはST3の動作に予想される変化ですか?
テストケース:
import org.stringtemplate.v4.ST; public class ST4Test { public static void main(final String[] args) { final String[] env_vars = new String[]{"one", "two", "three"}; try { // This used to work in ST3, but fails in ST4. final ST failingST = new ST("<env_vars:{ var | void* <var>() { return null; }}\n>"); failingST.add("env_vars", env_vars); System.out.printf("%s\n", failingST.render()); } catch (Exception ex) { // The failing example results in a NPE ex.printStackTrace(); } // This works, but requires quoting the "}" contained within the anonymous // template, which I find a bit disturbing, considering that I use ST for // generating C-code, which tends to use the occasional "}", along with the // fact that this used to work in ST3. final ST workingST = new ST("<env_vars:{ var | void* <var>() { return null; \\}\n}>"); workingST.add("env_vars", env_vars); System.out.printf("%s\n", workingST.render()); } }
私はテストケースのマークアップを修正しました(重要な部分は欠落していました)。 ST3でなぜ機能したのかについての私の無神経な推測は、クローズ}の後ろにテンプレート終了文字(外側テンプレートの場合はドルよりも大きい)が続くかどうかを判断するための先読み匿名テンプレートのクローズトークンとして解釈します。 – pmf