4

最近リリースされた Stringtemplate 4 のベータ版に問題があります。

StringTemplate 3 では、次のようなテンプレートを使用していました。

<env_vars:{ var | void* <var>() { return null; }}>

つまり、リテラルの右中括弧 ("}") を含む無名テンプレートであり、これらは最初の右中括弧をエスケープすることなく、ST3 で十分に機能しました。

ST4 を使用すると、NPE が発生します (以下のテスト ケースはスタック トレースを出力します)。リテラルの右中括弧をエスケープすることで機能させることができるため、テンプレートは次のようになります (最初の右中括弧の前にある引用符のバックスラッシュに注意してください)。

<env_vars:{ var | void* <var>() { return null; \}}>

しかし、それは少し醜いようです。私は常に ST の邪魔にならない構文を賞賛してきましたが、出力される各 "{" を対応する "\}" と一致させる必要があることは、どういうわけか非常に非対称に思えます。

私が見逃しているものはありますか、それとも ST3 からの予想される動作の変更ですか?

テストケース:

org.stringtemplate.v4.ST をインポートします。

パブリック クラス ST4Test
{
  public static void main(final String[] args)
  {
    final String[] env_vars = new String[]{"one", "two", "three"};

    試す
    {

      // これは ST3 では機能していましたが、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());
    }
    キャッチ(例外例)
    {
      // 失敗した例では NPE が発生します
      ex.printStackTrace();
    }

    // これは機能しますが、匿名に含まれる「}」を引用符で囲む必要があります
    // テンプレート。ST を使用していることを考えると、少し気がかりです。
    // ときどき "}" を使用する傾向がある C コードを生成します。
    // これは 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());
  }
}
4

1 に答える 1

4

私は得る

テスト 1:44: 無効な文字 '}'

ST3で動作したと確信していますか?内側の } は一致しますが、引用符と同様に、最初の } でテンプレートを終了する必要があります。ST は、テンプレート内のテキストをまったく解釈すべきではありません。これはどう?

<env_vars:{ var | void* <var>() {{{{{{{{{{{ return null; }>

それはうまくいくはずですが、 { の中を見るとうまくいきません。それは、あなたが生成している head not complete func である可能性がありますよね?

v3 にバグがあったようです。;)

テル

于 2011-01-19T18:58:49.693 に答える