我对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()
但是,当我在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尚未更新,因此可能会对模块进行一些语法更改。是
答案 0 :(得分:4)
require
搜索预定义的目录列表,如What are the paths that "require" looks up by default?中所述。它失败了,因为它无法在任何这些目录中找到mystuff.rb
。
load
将在当前目录中查找文件。
至于:
但是,如果我将'mystuff.rb'编辑为MyStuff类的定义 与模块MyStuff相反,没有区别。
我不确定我明白你的意思是“无差别”。如果你的意思是require
和load
分别继续失败并成功,那么这是有意义的,因为require
失败与文件内容和代码的内容无关。重新测试的行为与Mystuff是一个类还是一个vanilla模块无关。
答案 1 :(得分:2)
您可以通过更改
轻松解决此问题require 'mystuff'
到
require_relative './mystuff'