【问题标题】:load 'file.rb' versus require 'Module' in Ruby在 Ruby 中加载“file.rb”与需要“模块”
【发布时间】: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 以来一直没有更新,因此模块的语法可能发生了一些变化。是吗?

【问题讨论】:

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


【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-16
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多