1

我是 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 插件悄悄地将第一个字母大写。这可能是一个错误吗?

4

2 回答 2

1

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

在此处阅读有关 Ruby 作用域的更多信息。

于 2014-09-21T09:53:37.593 回答
0

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

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

aModule.rb

module aModule
aConstant = 7
end

测试.rb

require 'aModule'
puts aModule::aConstant

cmd: cd 进入 Test.rb 文件夹和ruby Test.rb 错误: ``require': cannot load such file -- tokenizer.rb (LoadError)` help: Ruby 'require' error: cannot load such file

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

require './tokenizer'

无需使用 .rb 作为后缀,因为 Ruby 足够聪明,无论如何都知道这就是您的意思。

我做了以下更改:

测试.rb

require './aModule'
puts aModule::aConstant

cmd: ruby Test.rb error: class/module name must be CONSTANT (SyntaxError) in aModule.rb help: NameError in Ruby

我做了以下更改:

aModule.rb

module AModule # capital
aConstant = 7
end

测试.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

测试.rb

require './AModule'
puts AModule::AConstant

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

于 2014-09-21T08:14:05.070 回答