2016-01-11 57 views
10

jruby 1.7.23(1.9.3p551)2015-11-24關於Java HotSpot™64位服務器VM 1.7.0_79-b15 + jit的f496dd5 [ Windows 7中,AMD64]從Java訪問JRuby腳本頂級環境的變量

我在腳本容器中運行一個小腳本是這樣的:

(RubyObject) ro = (RubyObject)container.runScriptlet(org.jruby.embed.PathType.RELATIVE,"example.rb"); 

其中container是類型ScriptingContainer的。 「局部變量行爲」被設置爲「瞬態」。

文件example.rb包含以下行:

foo='xxx' 
$bar='yyy' 
'zzz' 

我可以在Java方面的價值「ZZZ」檢索,因爲它是明確地runScriptlet返回。我也可以檢索$ bar的值使用

container.get("$bar") 

有沒有辦法檢索foo的值? container.get("foo")返回空指針。

我也嘗試將局部變量行爲更改爲「持久性」,但結果仍然相同。

回答

0

我想你已經使用了這個ScriptingContainer(LocalVariableBehavior.PERSISTENT)但這必要意味着你已經可以訪問這個scriptContainer內部的大部分內容了。

也許,我們可以修改你的代碼並嘗試使用解析。請參閱example 4。它可能會啓發你。希望這可以幫助。

+0

不,正如我寫的,我將局部變量行爲設置爲TRANSIENT。我不想保留局部變量,也不需要訪問存儲在腳本容器中的局部變量。也許我對瞬態與持久的理解是有缺陷的。根據我的理解,持久化適用於函數內部的局部變量。從你的迴應中,這聽起來也適用於腳本頂級環境中的變量。如果是這種情況,我明白,爲什麼我的變量'foo'不能被訪問。 – user1934428

+0

我看到我必須澄清一些事情(我不清楚這是重要的一點,但看起來是這樣):我的腳本只運行一次。這次運行的唯一目的是創建幾個Ruby對象,然後從我的Java代碼訪問它。 Java代碼存儲對這些Ruby對象的引用,並在後續中將它們用作普通Java對象。當然,我保證,總是會引用ScriptingComtainer,以免它可能被垃圾收集,並且我不確定這會對我的Ruby對象產生什麼影響.... – user1934428