JRuby没有看到变量绑定

时间:2015-10-06 11:45:45

标签: java jruby jsr223

由于某种原因,jruby没有看到Java中设置的变量绑定。根据此处https://github.com/jruby/jruby/wiki/Embedding-with-JSR-223的文档,以下示例应该工作:

public static void main(String[] args) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("jruby");
    Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
    bindings.put("owner", "Otto");
    engine.eval("puts \"hello #{owner}\"", bindings);
}

在我的测试中,我得到了例外:

NameError: undefined local variable or method `owner' for main:Object
  <top> at <script>:1
Exception in thread "main" javax.script.ScriptException: org.jruby.embed.EvalFailedException: (NameError) undefined local variable or method `owner' for main:Object

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

这种行为的原因是默认情况下局部变量不能在Java和JRuby之间共享,而只能在全局变量之间共享。请参阅:https://github.com/jruby/jruby/wiki/RedBridge关于局部变量行为。解决方案是明确设置

System.setProperty("org.jruby.embed.localvariable.behavior", "persistent");

System.setProperty("org.jruby.embed.localvariable.behavior",
"transient");

在第一种情况下,局部变量保持在评估之间,在后一种情况下,它们是每次评估。