在 Ruby 中加载“file.rb”与需要“模块”

Posted

技术标签:

【中文标题】在 Ruby 中加载“file.rb”与需要“模块”【英文标题】:load 'file.rb' versus require 'Module' in Ruby 【发布时间】:2014-01-22 13:07:20 【问题描述】:

我对@9​​87654323@ 和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 Text 控制台或使用 ruby apple.rb 运行 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 以来一直没有更新,因此模块的语法可能发生了一些变化。是吗?

【问题讨论】:

你能把require 'mystuff'换成require_relative 'mystuff'吗?参见例如***.com/questions/3672586/… 【参考方案1】:

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

另一方面,load 会在当前目录中查找文件。

至于:

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

我不确定我理解您所说的“没有区别”是什么意思。如果您的意思是 requireload 分别继续失败和成功,这是有道理的,因为 require 失败与文件内容的内容无关,并且您正在测试的代码的行为同样独立Mystuff 是一个类还是一个普通模块。

【讨论】:

【参考方案2】:

你可以通过改变轻松解决这个问题

require 'mystuff'

require_relative './mystuff'

【讨论】:

以上是关于在 Ruby 中加载“file.rb”与需要“模块”的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件中加载哈希?

Appium:Ruby:在gem中加载错误

ruby 在目录中加载多个文件并要求它们

ruby 解决方法是在bundler环境中加载irb特定的gem(在.irbrc中加载​​),比如rails3 console

ruby 和 irb 都不能在当前目录中加载 .rb 文件

angular js:是不是需要在模块文件中加载所有控制器和工厂/服务