2015-06-16 4 views
1

Я использую JEXL http://commons.apache.org/proper/commons-jexl/ для оценки строк.Как конкатенировать строку и выражение в 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?

+0

Что значит «не работает»? Вы получаете сообщение об ошибке? Неверный результат? Какую версию JEXL вы используете? Я не получаю ParseException с 2.1.1. – rgettman

+0

Я использую версию 2.1.1. Я получаю неправильный результат – abhinav

+0

@rgettman, теперь я не получаю ParseException. Но он оценивает выражение неверным результатом. – abhinav

ответ

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. Добавление скобок в нужное место сначала приводит к выполнению оператора ?:.

+0

Идеальный ответ. Благодарю. – abhinav

Смежные вопросы