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);

它正在将表达式评估为错误的结果。当我尝试连接两个字符串时,它运行良好。当我尝试连接字符串和表达式时它不起作用。

那么,如何在 JEXL 中连接字符串和表达式?

4

1 回答 1

3

似乎 JEXL 正在执行三元运算符的连接,'some text'并且output在执行三元运算符之前?:

使用您的原始表达式,'some text ' + output?'true':'false',我得到 的输出true。我不完全确定为什么'some text ' + falseyield 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 回答