Почему я получаю NoMethodError от IRB для моего собственного модуля и метода - PullRequest
3 голосов
/ 28 октября 2010

Я взял этот пример точно из 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 ]

2 голосов
/ 29 мая 2011

Я столкнулся с этим с помощью irb на Mac, работающем под управлением Snow Leopard, используя версию ruby ​​по умолчанию (и, конечно, irb), установленную с OS X. Мне удалось обойти это, включив модуль в IRB после загрузки модуляили в файле после определения модуля.

include module_name

Я не уверен, является ли это дефектом или известным поведением.

0 голосов
/ 25 сентября 2014

Я знаю, что этому вопросу уже 3 года, но так как это первое попадание в Google по этой проблеме, и я весь день бился головой об стену с той же проблемой, выполняя урок здесь: http://ruby.learncodethehardway.org/book/ex25.html, здесь идет: определение функции в модуле должно читаться как

module Find
  def Find.match(*paths)
    ...
  end
end
0 голосов
/ 28 октября 2010

Из какого каталога вы звоните IRB?Попробуйте позвонить из каталога, в котором находится файл find.rb.Кроме того, я не знаю, имеет ли это какое-то значение, но принято называть файл строчной версией модуля / класса.Таким образом, модуль будет Find, а имя файла будет find.rb.Вам не нужно вызывать require в самом файле.

Итак, запустите окно командной строки, перейдите в каталог, содержащий find.rb, и выполните irb.В IRB вы должны иметь возможность require "find", и он должен возвращать true.Оттуда вы сможете позвонить Find.match.

0 голосов
/ 28 октября 2010

Единственное объяснение состоит в том, что опубликованный вами код - это не код, который вы выполняете, поскольку и его тщательное чтение, и просто вырезание и вставка и запуск не показывают абсолютно никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...