Загрузить '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:in
require ': не могу загрузить такой файл - 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.