JRuby 看不到变量绑定
JRuby does not see variable bindings
出于某种原因,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
我错过了什么吗?
该行为的原因是默认情况下局部变量不能在 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");
在第一种情况下,局部变量跨评估保留,在后一种情况下,它们是每次评估。
出于某种原因,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
我错过了什么吗?
该行为的原因是默认情况下局部变量不能在 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");
在第一种情况下,局部变量跨评估保留,在后一种情况下,它们是每次评估。