了解ruby模块

时间:2014-09-21 07:35:54

标签: ruby eclipse ruby-2.0 dltk

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

2 个答案:

答案 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?为什么我需要在模块名称与测试脚本位于同一文件夹之前附加./