Jruby встроенные модули и классы - PullRequest
2 голосов
/ 31 марта 2010

У меня есть файл ruby ​​следующим образом:

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?

Спасибо

1 Ответ

2 голосов
/ 31 марта 2010

Убедитесь, что у вас нет синтаксических ошибок. Обычно я получаю эти ошибки, когда не обращаю внимания на то, что я пишу ...

Во-вторых, вы не можете написать следующее:

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

    }
}
...