Есть ли какой-либо способ получить привязку строки Boolean вместо ее логической привязки в Java

#java

#java

Вопрос:

Вот что мне нужно сделать:

     public void verifyConditionSatisfies( Boolean condition){
  
                if (condition) {
                    System.out.println(condition.toString()  "satisfies)//This is the part i need to get its String binding, not boolean evaluated version
                }else{
                    System.out.println(condition.toString()  " does not satisfy)
                }

    }
  

Вот предполагаемое использование:

 verifyConditionSatisfies(10>9)
  

следует оценивать как

 "10>9 satisfies"
  

Комментарии:

1. Это невозможно. Вам придется написать некоторый дополнительный код, чтобы зафиксировать это поведение, возможно, обернуть его в свой собственный класс.

2. Вашей функции передается логическое значение, то есть true, а не "10>9"

3. Передаются только значения аргументов. Вам пришлось бы передавать строку отдельно.

4. Что вам нужно сделать: поймите, что вы делаете. Если вы действительно хотите напечатать «10> 9» … тогда это означает, что вы хотите иметь систему, которая понимает выражения и синтаксис. Я думаю, вам действительно следует отступить назад и провести небольшое исследование языков программирования, что они собой представляют и как они работают. И почему написание if( a > b) в исходном коде вовсе не является «отправной точкой» для возможности печати a > b какому-либо пользователю-человеку (в смысле получения фактической логики условий и превращения ее в строку).

5. Логическое значение — это просто true или false. Он не сохраняет никакой памяти о том, как был получен результат true / false.

Ответ №1:

Как упоминалось в комментариях, получение логического выражения 10>9 в виде строки невозможно. Возможно, было бы проще предоставить выражение в виде строки "10>9" .

Вот неортодоксальный способ сделать это:

 public class BooleanEval {
    public static void main(String[] args) throws ScriptException {
        System.out.println(new BooleanEvaluation("10>9"));
        System.out.println(new BooleanEvaluation("25<3"));
    }

    public static class BooleanEvaluation {
        private static final ScriptEngine javaScriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
        private String expression;
        private boolean evaluation;

        public BooleanEvaluation(String eval) throws ScriptException {
            this.expression = eval;
            this.evaluation = Boolean.parseBoolean(String.valueOf(javaScriptEngine.eval(expression)));
        }

        @Override
        public String toString() {
            String evalString = evaluation ? "satisfies" : "does not satisfy";
            return expression   " "   evalString;
        }
    }
}
  

Выводит:

 10>9 satisfies
25<3 does not satisfy
  

Комментарии:

1. Отличный ответ, но я думаю, вы должны хотя бы объяснить, как это работает. И какие компромиссы есть у этого решения.

Ответ №2:

Это

   verifyConditionSatisfies(10>9);
  

эффективно оценивается как

   Boolean temp = 10 > 9;
  verifyConditionSatisfies(temp);
  

Метод не знает о том, как был вычислен его аргумент.
Последовательность символов 1, 0, >, 9 существует только в исходном коде.

Итак, ответ «нет».

Комментарии:

1. Ну, в программном обеспечении ответ в основном «да». Это просто требует тонны работы. Просто напишите небольшой интерпретатор, который понимает элементы синтаксиса и так далее. Хорошее упражнение для новичков. Может быть выполнено за 2-3 недели 😉

2. Конечно, это все просто единицы и нули, но я думаю, что это относится к категории «если вам нужно задать вопрос, то ответ фактически отрицательный».

3. Смотрите комментарий, который я поместил под вопросом 😉