Загрузить 'file.rb' против 'Module' в Ruby

Я смущен разницей между load 'file.rb' а также require 'Module', В " Learn Ruby the Hard Way" пример использования модуля представлен двумя файлами (mystuff.rb а также apple.rb):

mystuff.rb

module MyStuff
    def MyStuff.apple()
        puts "I AM APPLES!"
    end
end

apple.rb

require 'mystuff'

MyStuff.apple()

Тем не менее, когда я бегу apple.rbлибо в консоли Sublime Text, либо с помощью ruby apple.rbЯ получаю Load Error, Я также пытался require 'MyStuff', а также require 'mystuff.rb', но я все еще получаю Load Error,

Итак, я переключил первую строку apple.rb в load 'mystuff.rb', что позволяет ему работать. Тем не менее, если я редактирую 'mystuff.rb' быть определением class MyStuff в отличие от module MyStuff, нет никакой разницы.

Для справки, Load Error является:/Users/David/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:inrequire ': не могу загрузить такой файл - mystuff (LoadError)`

Я заглянул в kernel_require.rb и посмотрел на require определение, но так как я Ruby Nuby (действительно, новичок в программировании), это было немного подавляющим. Поскольку Learn Ruby the Hard Way не обновлялся с 2012-10-05, вероятно, были некоторые синтаксические изменения для модулей. Да?

2 ответа

Решение

Вы можете решить это легко, изменив

require 'mystuff'

в

require_relative './mystuff'

require выполняет поиск в предварительно определенном списке каталогов, как описано в разделе "Какие пути" требуется "ищет по умолчанию?, Это терпит неудачу, потому что это не может найти mystuff.rb в любом из этих каталогов.

load, с другой стороны, будет искать файлы в текущем каталоге.

Что касается:

Однако если я отредактирую "mystuff.rb", чтобы он стал определением класса MyStuff, а не модуля MyStuff, разницы нет.

Я не уверен, что понимаю, что вы подразумеваете под "без разницы". Если вы имеете в виду, что require а также load продолжать терпеть неудачу и преуспевать, соответственно, что имеет смысл, так как require Ошибка не зависит от содержимого содержимого файла, и код, который вы тестируете, ведет себя одинаково, независимо от того, является ли Mystuff классом или модулем vanilla.

Другие вопросы по тегам