Как объединить строку и выражение в 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. Добавление скобок в нужное место заставляет выполнение ?:
оператор первый.