1

我通过 JRuby 将 Ruby 嵌入到 Java 应用程序中,并且需要测试给定的 Ruby 脚本是否定义了各种方法。我有一个非常简单的 JRuby 设置:

ScriptingContainer container = new ScriptingContainer();
Object receiver = container.runScriptlet(new FileReader(SCRIPT_PATH));

SCRIPT_PATH包含以下内容的文件在哪里:

def processDoc(doc)
  return doc
end

我现在想确定脚本是否定义了该processDoc方法,但除了实际调用之外找不到其他方法processDoc,我希望避免这种方法。我已经尝试过respond_to? 'processDoc'and methods.include? 'processDoc',但都不起作用,因为以下成功的断言集表明:

Object doc = new Object();
assert container.runScriptlet("respond_to? :processDoc") == Boolean.FALSE;
assert container.runScriptlet("methods().include? 'processDoc'") == Boolean.FALSE;
assert receiver == null;
assert container.callMethod(receiver, "processDoc", doc) == doc;

是否有任何其他技术可以用来确定一个简单的 JRuby 脚本是否定义了一个具有特定名称的方法,而不实际调用该方法?

4

1 回答 1

2

当定义一个全局方法时,它变成了一个私有方法Object。因此,您必须使用include_all参数 forrespond_to?才能使其工作:

container.runScriptlet("Object::respond_to?(:processDoc, true)")
于 2013-03-24T13:19:10.970 回答