3

Rhino で動作する JSR 223 (スクリプト) コードをテストして、Nashorn でどのように動作するかを確認しています。Bindings違いの 1 つの領域は、 への引数を介して渡された変数への更新の処理にありますengine.eval()。Rhino では、このメソッドを使用して、スクリプトを評価するときに動的変数バインディングを渡し、スクリプトの実行後にこれらの変数の更新された値を読み取ることもできます。ただし、Nashorn ではこれは機能しません。Bindings オブジェクト内のすべての変数の値は、スクリプトの実行後も初期値のままです。

TestNG テスト ケースで説明するには:

@Test
public void shouldSupportReadingVariablesFromBindings() throws Exception {
    // Given
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
    Bindings vars = new SimpleBindings();
    vars.put("state", 1);

    // When
    engine.eval("state = 2", vars);
    Number result = (Number) vars.get("state");

    // Then
    assertEquals(result.intValue(), 2);

}

Rhino (Mac OS X 10.9.3 上の Apple JDK 1.6.0_65) を使用すると、テストに合格します。Nashorn (Oracle JDK 1.8.0_b132) では失敗します。後で変数を読み取るために、さまざまなアプローチを試しました- 、などを呼び出しますengine.get()engine.getBindings(ScriptContext.ENGINE_SCOPE).get()結果engine.getContext().getBindings(...).get()は常にnullです。

を呼び出して後で で読み取ると、動作させることができますが、バインディングを引数として渡すだけの場合と比べると、少し面倒です。engine.put("state", 1)engine.get("state")

JSR-223仕様を読んでも、この使用法をサポートする文言が見つからないので、エンジン固有ですか? Nashorn で私が望むことを達成する他の方法はありますか?

編集: 機能する 1 つのアプローチは、各変数を でラップし、Javascript でそれらのAtomicReference明示的なメソッドを呼び出すことです。.set(..)醜いですが、おそらく実行可能です。

4

1 に答える 1