我有一个 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 的文档很少?
谢谢
最佳答案
确保您没有语法错误。通常当我不注意我写的内容时,我会遇到这些错误...
其次,您不能写以下内容:
Object example = jruby.eval("Myclass.new");
原因是您的类(class)在模块中。相反,使用这个:
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"));
}
}
关于java - Jruby 嵌入式模块和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548442/