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")
返回空指針。
我也嘗試將局部變量行爲更改爲「持久性」,但結果仍然相同。
不,正如我寫的,我將局部變量行爲設置爲TRANSIENT。我不想保留局部變量,也不需要訪問存儲在腳本容器中的局部變量。也許我對瞬態與持久的理解是有缺陷的。根據我的理解,持久化適用於函數內部的局部變量。從你的迴應中,這聽起來也適用於腳本頂級環境中的變量。如果是這種情況,我明白,爲什麼我的變量'foo'不能被訪問。 – user1934428
我看到我必須澄清一些事情(我不清楚這是重要的一點,但看起來是這樣):我的腳本只運行一次。這次運行的唯一目的是創建幾個Ruby對象,然後從我的Java代碼訪問它。 Java代碼存儲對這些Ruby對象的引用,並在後續中將它們用作普通Java對象。當然,我保證,總是會引用ScriptingComtainer,以免它可能被垃圾收集,並且我不確定這會對我的Ruby對象產生什麼影響.... – user1934428