1

我正在尝试评估这个表达式:

ScriptEngineManager sem = new ScriptEngineManager () 
ScriptEngine scriptEngine = sem.getEngineByName("js") ;
String expr = "true ^ true";
Boolean obj = (Boolean) scriptEngine.eval(expr);

然而返回的结果是java Double。我尝试了 String expr 的各种选项,例如:

String expr = "0x1 ^ 0x0"; String expr = "1 ^ 0";

基本上我希望能够使用 JavaScript 引擎来评估可能看起来像这样的各种表达式:

"ture && false || false (true || false && true || false XOR true)"

所有其他运算符,如 && 或 || 当我评估这样的表达式并返回布尔值时工作得很好,但是当它出现 XOR(它具有 JavaScript 等效的按位 ^ 运算符)时,它返回 Double。我真的不想将表达式转换为将 XOR 替换为某些逻辑运算符(例如 ((true || false) && !(true && false)) ),因为那时我必须解析整个表达式字符串才能转换 XOR成上面的逻辑表达式。我评估这个表达式的重点是让我能够在不必解析它的复杂性的情况下进行评估。

任何帮助都感激不尽!提前致谢!

4

4 回答 4

2

从这里引用:http: //www.howtocreate.co.uk/xor.html

“不幸的是,JavaScript 没有逻辑 XOR 运算符。它有一个按位 XOR 运算符 ^ 可以执行两个数字的按位比较,但是当您想要获得两个表达式的 XOR 的结果时,这无济于事,这样做不返回数字。

可以使用以下方法模拟 XOR 运算符:

if( ( foo && !bar ) || ( !foo && bar ) ) {
  ...
}

或者使用以下命令少做一次操作(取决于 foo 和 bar 的值):

if( ( foo || bar ) && !( foo && bar ) ) {
  ...
}

或者使用三元运算符使其更小:

if( foo ? !bar : bar ) {
  ...
}
于 2013-01-16T17:37:19.593 回答
1

您可以使用双重否定在 JavaScript 代码中强制强制转换为布尔值:

Boolean obj = (Boolean) scriptEngine.eval("!!(" + expr + ")");
于 2013-01-16T17:31:01.620 回答
0

在没有任何明确替代方案的情况下,我正在实施此解决方案:

    boolean useDouble = false;
    String expr = "true ^ false";
    if(expr.contains("^"))
    {
        useDouble = true;
    }
            ...
            if(useDouble)
         {
             Double d = (Double) scriptEngine.eval(expr); 
             boolean r = (d != 0.0);
             System.out.println(" result: " + r);
         }
         else
         {
             Boolean b = (Boolean)scriptEngine.equals(expr);
             System.out.println(b.getClass().getName() + "result:" + b);
         }
于 2013-01-16T19:03:58.013 回答
0

与其使用 XOR,不如编写更自然的方法,!= 例如true != false ,如果这在 Javascript 中不起作用,我会感到惊讶。

于 2013-01-16T17:26:28.123 回答