2014-01-29 27 views
0

找回傳遞給JRuby的變量,這可能是簡單的,我會尋找這一點,但沒有運氣從Java

我的代碼:

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");輸出爲1244System.out.println(a);1234 現在我想的a變量必須是從JRuby中運行後的變化,從而使 System.out.println(a);應該1244 如何做到這一點?

+0

嘗試傳遞一個對象,例如Integer而不是int。 –

+0

謝謝,我已經嘗試過但不能工作:) – Ryo

+0

Phooey。我從Java應用程序中調用Ruby腳本並獲取信息的代碼是在NDA下實現的,因此我無法共享它,並且因爲所有的類加載器等而非常複雜以便啓動。Ruby腳本實現了一個接口,然後使用org.jruby.javasupport.JavaEmbedUtils.rubyToJava獲取Ruby類並將其轉換爲接口,以便至少可以調用getter? –

回答

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"));