質問: engine.get("tmp"); //→"1.2.3" ``` ### 質問 なぜ、`engine.get("C.version")`では取得できなかったのでしょうか?
回答: リファレンスによればこのメソッドを「任意のJavaScriptの式を評価できるもの」とは捉えない方がよさそうです。 「このエンジンの状態の値セットを取得します。値は、実装に応じて、setValueを使用して設定された値、またはScriptEngineの状態のほかの値になります。getBindings(ScriptContext.ENGINE_SCOPE).getと同じ結果になります。」 任意の式を評価した結果の値を参照したい場合はevalを使うとよいと思います。やってみると、 `Object a = engine.eval("C.version");` で値が取れました。 ちょっと補足します(Oracle JDK8にはいっているエンジンを使ってます): engine.get("C"); ならCの値が返ってきます。質問者さんが実行されたように engine.get("tmp") でもできるのですよね。要するにgetは単純に変数名だけを指定してその値を取ってくるという目的のもののようです。 C.version は「Cという変数に入っているオブジェクトのversionというプロパティーを得る」ということなのでしょうから、単なる変数の参照ではなくJavascriptエンジンに式の評価をさせなければならないということだと思います。そのためgetはNGでevalならOKになるのでしょう。 実際にgetの中を見てみると「引数をキー名として、そのキーに対応する値があるか?」のような単純な処理しかしていないように見えました。