Как объединить строку и выражение в JEXL

Я использую 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?

1 ответ

Решение

Похоже, что JEXL выполняет объединение 'some text' а также output перед троичным оператором ?: выполняется.

С вашим оригинальным выражением, 'some text ' + output?'true':'false'Я получаю вывод true, Я не совсем уверен, почему 'some text ' + false доходность true, но должно быть какое-то неявное преобразование в boolean здесь происходит

Удаление троичного оператора, используя 'some text ' + output, Я получил some text false,

Поместив скобки в исходное выражение, чтобы явно выразить, что происходит, я могу продублировать вывод true с выражением ('some text ' + output)?'true':'false',

Размещая скобки вокруг троичного оператора, я могу заставить троичный оператор работать первым и получить вывод some text false с выражением 'some text ' + (output?'true':'false'),

Это происходит потому, что троичный оператор ?: имеет более низкий приоритет, чем + оператор в JEXL, соответствующий приоритету оператора Java. Добавление скобок в нужное место заставляет выполнение ?: оператор первый.

Другие вопросы по тегам