你的例子永遠不能像書面那樣工作。 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"));
嘗試傳遞一個對象,例如Integer而不是int。 –
謝謝,我已經嘗試過但不能工作:) – Ryo
Phooey。我從Java應用程序中調用Ruby腳本並獲取信息的代碼是在NDA下實現的,因此我無法共享它,並且因爲所有的類加載器等而非常複雜以便啓動。Ruby腳本實現了一個接口,然後使用org.jruby.javasupport.JavaEmbedUtils.rubyToJava獲取Ruby類並將其轉換爲接口,以便至少可以調用getter? –