jruby 1.7.23(1.9.3p551)2015-11-24 Java HotSpot(TM)64ビットサーバVM 1.7.0_79-b15 + jit [ Windows 7の-AMD64]JavaからJRubyスクリプトのトップレベル環境への変数へのアクセス
私はこのように私のスクリプトコンテナ内のスクリプトレットを実行します。container
はタイプScriptingContainerである
(RubyObject) ro = (RubyObject)container.runScriptlet(org.jruby.embed.PathType.RELATIVE,"example.rb");
。 「ローカル変数の振る舞い」は「一時的」に設定されています。
foo='xxx'
$bar='yyy'
'zzz'
それが明示的にrunScriptletから返されたので、私は、Java側から値「ZZZ」を取得することができます。
ファイルexample.rbは、次の行が含まれています。私はまた、$ barの値を取得することができます
container.get("$bar")
fooの値を取得する方法はありますか? container.get("foo")
はヌルポインタを返します。
また、ローカル変数の動作を「永続的」に変更しようとしましたが、結果は同じです。
いいえ、私が書いたように、ローカル変数の動作をTRANSIENTに設定しました。ローカル変数を保持したくないので、スクリプトコンテナに格納されているローカル変数にアクセスする必要はありません。たぶん私の一時的な対永続的な理解に欠陥があるかもしれません。私の理解から、永続的な関数内のローカル変数に適用されます。あなたの応答から、それはスクリプトの最上位環境の変数にも当てはまります。この場合、なぜ私の変数 'foo'にアクセスできないのか理解しています。 – user1934428
私は何かを明確にしなければならないことがわかります(これは重要な点ですが、一見明らかです)。私のスクリプトは一度だけ実行されます。この実行の唯一の目的は、いくつかのRubyオブジェクトを作成してJavaコードからアクセスすることです。 JavaコードはこれらのRubyオブジェクトへの参照を格納し、あたかもそれらが普通のJavaオブジェクトであるかのように続編で使用します。もちろん、ScriptingComtainerの参照は常に残っているので、ガベージコレクションが発生しないようにするために、Rubyオブジェクトにどのような影響があるかわかりません。 – user1934428