ruby - 加载 'file.rb' 与在 Ruby 中需要 'Module'

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

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

我的东西.rb

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

苹果.rb

require 'mystuff'

MyStuff.apple()

但是,当我在 Sublime Text 控制台中或使用 ruby apple.rb 运行 apple.rb 时,我收到了一个加载错误。我也尝试过 require 'MyStuff'require 'mystuff.rb',但我仍然遇到 Load Error

因此,我将 apple.rb 的第一行切换为 load 'mystuff.rb',这样它就可以运行了。但是,如果我将 'mystuff.rb' 编辑为 class MyStuff 的定义而不是 module MyStuff,则没有区别。

作为引用,加载错误是: /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(实际上是编程新手),它是有点压倒性。由于从 2012 年 10 月 5 日起就没有更新过 Learn Ruby the Hard Way,因此可能对模块进行了一些语法更改。是吗?

最佳答案

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

另一方面,

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

至于:

However, if I edit 'mystuff.rb' to be a definition of class MyStuff as opposed to a module MyStuff, there is no difference.

我不确定我是否理解您所说的“无差异”是什么意思。如果您的意思是 requireload 分别继续失败和成功,那是有道理的,因为 require 失败与内容无关无论 Mystuff 是类还是普通模块,文件内容和您正在测试的代码的行为都相同。

关于ruby - 加载 'file.rb' 与在 Ruby 中需要 'Module',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927771/

相关文章:

ruby - 什么是 Ruby 中的 "Syntax Error, unexpected tCONSTANT"错误?

ruby - 对具有唯一 object_id 的属性数组求和

ruby-on-rails - 生成 422 错误的错误页面

ruby-on-rails - 在 Cucumber 中重用 2 个不同模型之间的代码

module - 如何编译具有接口(interface)、模块和子例程的多文件夹 Fortran 项目

ruby-on-rails - 从 pgAdmin III 运行 heroku 数据库命令? (哈利的预发射器)

import - 不要在 coq 中导入符号

c++ - 在 LINUX C++ 中获取模块名称和进程名称

ruby - 正确的 Assert_Raise 单元测试和异常类的使用