这可能很简单,我会搜索这个,但没有运气
我有代码:
import org.jruby.embed.ScriptingContainer;
public class Test {
public static void main(String[] args){
ScriptingContainer container = new ScriptingContainer();
int a = 1234;
container.put("a", a);
container.runScriptlet("a = a+10 ; puts a");
System.out.println(a);
}
}
您可以看到container.runScriptlet("a = a+10 ; puts a");
的输出为1244
和System.out.println(a);
是1234
现在我想从jruby运行后必须更改a
变量,以便
System.out.println(a);
应为1244
怎么做?
答案 0 :(得分:0)
你的例子永远不会像书面那样工作。 int
是基本类型,将按值传递,而不是通过引用传递。也就是说,值1234传递给JRuby,而不是“a”。您可以通过在container.put
中为变量指定其他名称来轻松查看。
如果您只需要一个变量,可以return it from your script:
public class Main {
public static void main(String[] args){
ScriptingContainer container = new ScriptingContainer();
container.put("a", 1234);
Object v = container.runScriptlet("a += 10; a");
System.out.println(v);
}
}
如果您需要更多值,我建议您创建一个简单的bean,您可以使用它以有条理的方式传回值:
public class Main {
public static class Values {
private String name;
private Long age;
public void setName(String n) {
this.name = n;
}
public void setAge(Long a) {
this.age = a;
}
public String toString() {
return name + " is " + age + " years old!";
}
}
public static void main(String[] args){
ScriptingContainer container = new ScriptingContainer();
Values vs = new Values();
container.put("values", vs);
container.runScriptlet("values.age = 20; values.name = 'Tanya'");
System.out.println(vs);
}
}
作为第三种解决方案,请按照JRuby Javadocs:
中的示例进行操作ScriptingContainer container = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
container.runScriptlet("p=9.0");
container.runScriptlet("q = Math.sqrt p");
container.runScriptlet("puts \"square root of #{p} is #{q}\"");
System.out.println("Ruby used values: p = " + container.get("p") +
", q = " + container.get("q"));