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