【问题标题】:How can I check whether a JRuby script defines a particular method?如何检查 JRuby 脚本是否定义了特定方法?
【发布时间】:2013-03-13 13:32:12
【问题描述】:

我通过 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'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 脚本是否定义了一个具有特定名称的方法,而无需实际调用该方法?

【问题讨论】:

    标签: ruby jruby


    【解决方案1】:

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

    container.runScriptlet("Object::respond_to?(:processDoc, true)")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2019-10-14
      • 2012-05-16
      相关资源
      最近更新 更多