为什么我从IRB获取NoMethodError用于我自己的模块和方法

时间:2010-10-28 15:17:27

标签: ruby methods

我从Ruby Cookbook中采用了这个完全的例子。对我来说不幸的是,就像那本书中的很多例子一样,这个例子不起作用:

我的文件(Find.rb - 本地和Ruby \ bin保存):

require 'find'

    module Find
     def match(*paths)
      matched=[]
      find(*paths) { |path| matched << path if yield path }
      return matched
     end
     module_function :match
    end

我尝试从IRB这样调用它,根据本书提供的例子:

irb(main):002:0> require 'Find'
=> false

irb(main):003:0> Find.match("./") { |p| ext = p[-4...p.size]; ext && ext.downcase == "mp3" }

它应该在我的递归目录中返回一个mp3文件列表。相反,它这样做:

NoMethodError: undefined method `match' for Find:Module
        from (irb):3
        from C:/Ruby192/bin/irb:12:in `<main>'

是什么给出的?我是新手(虽然我必须说我和Python一起走得更远,而且要好得多!)。

如何让IRB使用我的方法?

4 个答案:

答案 0 :(得分:2)

我在运行Snow Leopard的Mac上使用irb遇到了这个问题,同时使用安装了OS X的默认版本的ruby(当然还有irb)。我可以通过在加载模块后将模块包含在IRB中来解决这个问题。或在模块定义之后的文件中。

include module_name

我不确定这是缺陷还是已知行为。

答案 1 :(得分:0)

唯一的解释是,您发布的代码不是您正在运行的代码,因为仔细阅读它并简单地剪切和粘贴并运行它显示绝对没有任何问题。

答案 2 :(得分:0)

您从哪个目录调用IRB?尝试从find.rb文件所在的目录中调用它。此外,我不知道它是否有任何区别,但惯例是将文件命名为模块/类的小写版本。因此模块将为Find,文件名为find.rb。您不应该在文件本身中进行require调用。

因此,启动命令提示符窗口,cd进入包含find.rb的目录并运行irb。在IRB中,您应该能够require "find"并且它应该返回true。从那里你应该可以致电Find.match

答案 3 :(得分:0)

我知道这个问题已经有3年了,但是因为这是谷歌第一次遇到这个问题,所以我整个下午一直在撞墙,同样的问题在这里做教程:{{3这里是:模块中的函数定义应该是

module Find
  def Find.match(*paths)
    ...
  end
end