了解 ruby​​ 模块

Posted

技术标签:

【中文标题】了解 ruby​​ 模块【英文标题】:Understanding ruby modules 【发布时间】:2014-11-15 09:45:36 【问题描述】:

我是 Ruby 新手,使用 eclipse、DLTK ruby​​ 插件和 Ruby 2.0。我创建了一个名为 AModule.rb 的 Ruby 模块文件,其中包含代码:

module AModule
  aConstant = 7
end

这是从同一项目中的测试 ruby​​ 脚本调用的:

require 'AModule'
puts AModule::aConstant

在上面代码的第二行,我得到了错误in '<main>': undefined local variable or method 'aModule' for main:Object (NameError)

我遵循了我的 codeacademy 教程,所以我没想到会发生这种情况。我在这里犯了什么错误?

PS:实际上,我想将我的模块文件命名为 **aM**odule.rb 而不是 **AM**odule.rb 。但是,DLTK 插件悄悄地将第一个字母大写。这可能是一个错误吗?

【问题讨论】:

无法复制。 @sawa - 实际上,我已经定义了它。我在puts中犯了一个小写错误。我现在修好了。同样的错误仍然存​​在。如果您在我的问题中没有发现任何错误或缺点,您能否将我投票给零分?谢谢。 我的评论适用于编辑后的问题(我删除的答案适用于编辑前的问题)。我不会按照你的要求以任何方式投票。你不应该要求那个。此外,正如我所写,它无法复制。 @sawa - 已复制和修复。我正在使用 ruby​​ 2.0。 因为 Ruby 有语法,就像 Java 一样。您可以学习语法或更改语言,我想没有人强迫您使用 Ruby。 【参考方案1】:

我使用 windows cmd 而不是 eclipse IDE。我将展示我用来查找代码错误并最终修复它们的步骤。 DLTK 插件在这里没有错。模块文件和测试脚本在同一个文件夹中。

LESSON - 模块名称和模块中的常量名称必须以大写字母开头。为什么,我不知道。

aModule.rb

module aModule
aConstant = 7
end

Test.rb

require 'aModule'
puts aModule::aConstant

cmd: cd 进入 Test.rb 文件夹和ruby Test.rb 错误: ``require':无法加载此类文件 -- tokenizer.rb (LoadError)` 帮助: Ruby 'require' error: cannot load such file

Ruby 1.9 已经从加载路径中删除了当前目录,因此 正如 Pascal 所说,您需要对此文件执行相对要求:

require './tokenizer'

没有必要用 .rb 作为后缀,因为 Ruby 足够聪明,可以知道 反正就是这个意思。

我做了以下更改:

Test.rb

require './aModule'
puts aModule::aConstant

cmd: ruby Test.rb 错误: class/module name must be CONSTANT (SyntaxError) 在 aModule.rb 中 帮助: NameError in Ruby

我做了以下更改:

aModule.rb

module AModule # capital
aConstant = 7
end

Test.rb

require './AModule'
puts AModule::aConstant

cmd: ruby​​ Test.rb 错误: undefined method 'aConstant' for AModule:Module (NoMethodError) 帮助: 使用了上面的链接。我认为常量也必须用大写命名。

最终工作代码:

aModule.rb

module AModule # capital
AConstant = 7 # capital
end

Test.rb

require './AModule'
puts AModule::AConstant

WTF 就是这样的 Ruby ???以及当模块名称与测试脚本位于同一文件夹中时,为什么我需要在模块名称之前附加 ./

【讨论】:

./ 解释here【参考方案2】:

您的问题是常量的名称必须以大写字母开头。否则 Ruby 会将其视为局部变量。那么它有什么问题呢?简短的回答:一切都与范围有关。局部变量仅在其词法范围内可见。 常数是完全不同的东西。常量始终可以通过所谓的namespace-resolution operator (::) 访问。

阅读更多关于 Ruby 作用域的信息here。

【讨论】:

以上是关于了解 ruby​​ 模块的主要内容,如果未能解决你的问题,请参考以下文章

Ruby mixins:扩展和包含

ruby入门知识:了解ruby历史及特性

了解范围和数组中的 ruby​​ splat

继续:Ruby on Rails 简单了解

Ruby学习-1.学习对象

Ruby 文件的输入与输出