2016-01-11 18 views
10

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")はヌルポインタを返します。

また、ローカル変数の動作を「永続的」に変更しようとしましたが、結果は同じです。

答えて

0

ScriptingContainer(LocalVariableBehavior.PERSISTENT)を使用していると思いますが、このスクリプトコンテナの内部にあるほとんどのものに既にアクセスできることを意味します。

多分、あなたのコードを少し修正し、解析を試みることができます。 example 4を参照してください。それはあなたを啓発するかもしれません。お役に立てれば。

+0

いいえ、私が書いたように、ローカル変数の動作をTRANSIENTに設定しました。ローカル変数を保持したくないので、スクリプトコンテナに格納されているローカル変数にアクセスする必要はありません。たぶん私の一時的な対永続的な理解に欠陥があるかもしれません。私の理解から、永続的な関数内のローカル変数に適用されます。あなたの応答から、それはスクリプトの最上位環境の変数にも当てはまります。この場合、なぜ私の変数 'foo'にアクセスできないのか理解しています。 – user1934428

+0

私は何かを明確にしなければならないことがわかります(これは重要な点ですが、一見明らかです)。私のスクリプトは一度だけ実行されます。この実行の唯一の目的は、いくつかのRubyオブジェクトを作成してJavaコードからアクセスすることです。 JavaコードはこれらのRubyオブジェクトへの参照を格納し、あたかもそれらが普通のJavaオブジェクトであるかのように続編で使用します。もちろん、ScriptingComtainerの参照は常に残っているので、ガベージコレクションが発生しないようにするために、Rubyオブジェクトにどのような影響があるかわかりません。 – user1934428

関連する問題