1

文字列を評価するためにJEXL http://commons.apache.org/proper/commons-jexl/を使用しています。

次のコードを試しました

        String jexlExp = "'some text ' + output?'true':'false'";
        JexlEngine jexl = new JexlEngine();
        Expression e = jexl.createExpression(jexlExp);

        JexlContext jc = new MapContext();
        jc.set("output", false);

        Object x = e.evaluate(jc);
        System.out.println(x);

式を間違った結果に評価しています。2 つの文字列を連結しようとすると、うまく機能します。文字列と式を連結しようとすると機能しません。

では、JEXL で文字列と式を連結するにはどうすればよいでしょうか。

4

1 に答える 1

3

三項演算子が実行される前に、JEXL が'some text'andの連結を実行しているようです。output?:

あなたの元の式では'some text ' + output?'true':'false'、 の出力が得られますtrue。なぜ'some text ' + falseyieldsなのかは完全にはわかりませんが、ここで行われているtrue暗黙の変換のようなものがあるに違いありませんboolean

を使用して三項演算子を削除すると'some text ' + output、 が得られsome text falseます。

何が起こっているかを明示的に表現するために元の式に括弧を配置すると、 の出力をtrue式で複製できます('some text ' + output)?'true':'false'

三項演算子を括弧で囲むと、三項演算子が最初に動作some text falseし、式で出力を取得できます'some text ' + (output?'true':'false')

これは、三項演算子の優先順位が JEXL?:の演算子よりも低く、Java の演算子の優先順位と一致するために発生します。+適切な場所に括弧を追加すると、?:最初に演算子が強制的に実行されます。

于 2015-06-16T22:51:38.040 に答える