我是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插件悄然使第一个字母大写。这可能是个错误吗?
答案 0 :(得分:1)
您的问题是常量名称必须以UpperCaseLetter开头。否则Ruby会将其视为局部变量。那有什么不对呢?简短的回答:这都是关于范围的。局部变量仅在其词法范围内可见。
常数是一个完全不同的东西。始终可以通过所谓的namespace-resolution operator (::
)访问常量。
阅读有关Ruby范围here的更多信息。
答案 1 :(得分:0)
我使用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&#39;:无法加载此类文件 - 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
aModule.rb中的错误: class/module name must be CONSTANT (SyntaxError)
帮助: 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?为什么我需要在模块名称与测试脚本位于同一文件夹之前附加./
?