在Ruby中加载'file.rb'与require'Module'

时间:2014-01-04 22:56:22

标签: ruby module learn-ruby-the-hard-way

我对load 'file.rb'require 'Module'之间的区别感到困惑。在Learn Ruby the Hard Way,如何使用模块的示例设置了两个文件(mystuff.rbapple.rb):

mystuff.rb

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

apple.rb

require 'mystuff'

MyStuff.apple()

但是,当我在Sublime文本控制台或apple.rb中运行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要求':无法加载此类文件 - mystuff(LoadError)`

我偷看了kernel_require.rb并查看了require定义,但由于我是一个Ruby Nuby(确实是一个编程新手),它有点压倒性。由于自2012-10-05以来,Learn Ruby the Hard Way尚未更新,因此可能会对模块进行一些语法更改。是

2 个答案:

答案 0 :(得分:4)

require搜索预定义的目录列表,如What are the paths that "require" looks up by default?中所述。它失败了,因为它无法在任何这些目录中找到mystuff.rb

另一方面,

load将在当前目录中查找文件。

至于:

  

但是,如果我将'mystuff.rb'编辑为MyStuff类的定义   与模块MyStuff相反,没有区别。

我不确定我明白你的意思是“无差别”。如果你的意思是requireload分别继续失败并成功,那么这是有意义的,因为require失败与文件内容和代码的内容无关。重新测试的行为与Mystuff是一个类还是一个vanilla模块无关。

答案 1 :(得分:2)

您可以通过更改

轻松解决此问题
require 'mystuff'

require_relative './mystuff'