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)) など) に置き換えるのは本当にしたくありません。上記の論理式に。この式を評価することの要点は、その複雑さを解析しなくても評価できるようにすることです。

どんな助けでも大歓迎です!前もって感謝します!

4

4 に答える 4

2

Quoting from here: http://www.howtocreate.co.uk/xor.html

"Unfortunately, JavaScript does not have a logical XOR operator. It has a bitwise XOR operator ^ that can perform a bitwise comparison of two numbers, but this does not help when you want to obtain the result of an XOR of two expressions, that do not return a number.

The XOR operator can be simulated using this:

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

Or with one less operation (depending on the values of the foo and bar) using this:

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

Or using the ternary operator to make it even smaller:

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 に答える