这可能很简单,我会搜索这个,但没有运气
我有代码:
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
现在我希望a
变量必须在从Jruby运行后进行更改,以便 System.out.println(a);
应该是1244
如何做?
您的示例永远无法按书面形式工作。int
是一种原始类型,将按值,而不是通过参考传递。也就是说,价值1234被传递给jruby,而不是" a"。您可以通过在container.put
中给变量一个不同的名称来轻松看到这一点。
如果您只想返回一个变量,则可以从脚本中返回:
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"));