了解 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 模块的主要内容,如果未能解决你的问题,请参考以下文章