2016-01-11 56 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