从java获取传递给jruby的变量
这可能很简单,我会搜索这个,但没有运气 我有密码:从java获取传递给jruby的变量,java,ruby,jruby,Java,Ruby,Jruby,这可能很简单,我会搜索这个,但没有运气 我有密码: 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);
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;放置a”)代码>is1244
和System.out.println(a)代码>is1234
现在我希望a
变量在从jruby运行后必须更改,以便
System.out.println(a)代码>应为1244
如何做到这一点?您的示例永远无法像编写的那样工作int
是基本类型,将通过值传递,而不是通过引用传递。也就是说,值1234被传递给JRuby,而不是“a”。您可以在container.put
中为变量指定不同的名称,这一点很容易看出
如果只想返回一个变量,可以:
如果您需要更多值,我建议创建一个简单的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);
}
}
作为第三种解决方案,请遵循中的示例:
尝试传递一个对象,例如整数而不是整数。谢谢,我已经尝试过了,但没有成功:)Phooey。我为从Java应用程序调用Ruby脚本并获取信息而实现的代码在NDA下,因此我无法共享它,而且由于所有类加载器等原因,启动极其复杂。让Ruby脚本实现一个接口,然后使用org.jruby.javasupport.javaembeddeutils.rubyToJava获取Ruby类并将其转换为接口,这样您至少可以调用getter?
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);
}
}
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"));