2010-03-30 4 views
2

У меня есть файл рубиновый следующим образом: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 - нет. –

+0

yeh его не скопировал, я просто написал это. Однако я изменил его. sudo code больше всего на свете –

ответ

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 под моим classpath.

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

ваше право было то, что –

Смежные вопросы