2010-03-30 64 views
2

我有一個Ruby文件,如下所示:JRuby的嵌入式模塊和類

module Example 
    class Myclass 
     def t_st 
      "Hello World!" 
     end 
    end 
end 

現在如果這只是一類我將能夠使用Java代碼:

ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby"); 
jruby.eval(new BufferedReader(new FileReader("example.rb"))); 
Object example = jruby.eval("Myclass.new"); 

然而,這個類放在一個模塊中。調用相同的代碼如上述產生錯誤:

Exception in thread "main" org.jruby.embed.EvalFailedException: uninitialized constant myclass 

此外,調用:

Object example = jruby.eval("Example"); 

該模塊沒有返回錯誤。所以人們會認爲這遵循Ruby的格式。

Object example = jruby.eval("Example::myclass.new"); 

然而,我仍然得到了和以前一樣的錯誤。

任何人都可以幫忙嗎?由於JRuby上的文檔很少?

謝謝

+0

注意:您的Ruby類名必須以大寫字母開頭。 MyClass沒問題,myclass沒有。 – 2010-03-30 20:28:34

+0

你沒有複製我只寫了出來。我現在改變了它。 sudo代碼比任何東西 – 2010-03-30 20:42:04

回答

2

請確保您沒有語法錯誤。通常我得到這些錯誤時,我沒有注意到我寫的東西...

其次,你可以不寫如下:

Object example = jruby.eval("Myclass.new"); 

原因是,你的類是模塊中。相反,使用此:

Object example = jruby.eval("Example::Myclass.new"); 

除此之外,我不知道什麼問題可能是。對於我自己,我能夠在Java 1.6下運行以下代碼,並在我的類路徑下使用jruby-engine.jar和jruby-complete-1.4.0.jar。

package test; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class MyJavaClass { 
    public static void main(String arg[]) throws ScriptException, 
      FileNotFoundException { 

     ScriptEngine jruby = new ScriptEngineManager().getEngineByName("jruby"); 
     jruby.eval(new BufferedReader(new FileReader("example.rb"))); 
     Object example = jruby.eval("Example::Myclass.new"); 
     jruby.put("a", example); 
     System.out.println(jruby.eval("$a.t_st")); 

    } 
} 
+0

你的權利是 – 2010-03-31 20:57:13