2014-09-21 15 views
1

Je suis nouveau à Ruby, en utilisant l'éclipse, le plugin DLTK ruby ​​et le Ruby 2.0. J'ai créé un fichier de module Ruby appelé AModule.rb qui a le code:Comprendre les modules ruby ​​

module AModule 
    aConstant = 7 
end 

Ceci est appelé à partir d'un script Ruby test dans le même projet:

require 'AModule' 
puts AModule::aConstant 

Dans la deuxième ligne du code ci-dessus , j'obtiens l'erreur in '<main>': undefined local variable or method 'aModule' for main:Object (NameError)

J'ai suivi mon tutoriel codeacademy, donc je ne m'attendais pas à ce que cela se produise. Quelle est l'erreur que je fais ici? PS: En fait, je voulais nommer mon fichier de module ** aM ** odule.rb et non ** AM ** odule.rb. Mais, le plugin DLTK fait discrètement le premier alphabet en majuscule. Serait-ce un bug?

+0

Ne peut être reproduit. – sawa

+0

@sawa - En fait, je l'ai défini. J'ai fait une petite erreur minuscule dans les puts. Je l'ai réparé maintenant. La même erreur reste. Pouvez-vous s'il vous plait me mettre au neutre si vous ne voyez aucune erreur ou lacune dans ma question? Merci. –

+0

Mon commentaire s'applique à votre question après l'édition (ma réponse supprimée appliquée à votre question avant la modification). Je ne suivrai pas votre demande de vote de quelque façon que ce soit. Vous n'êtes pas censé demander cela. De plus, comme je l'ai écrit, il ne peut pas être reproduit. – sawa

Répondre

1

Votre problème est que le nom de la constante doit commencer par UpperCaseLetter. Autrement, Ruby le verra comme variable locale. Alors qu'est-ce qui ne va pas? Réponse courte: tout est une question de portée. Les variables locales ne sont visibles que dans leur portée lexicale. Constant est une chose très différente. Constant peut toujours être accessible via ce que l'on appelle namespace-resolution operator (::).

En savoir plus sur Ruby scoping here.

0

J'ai utilisé Windows cmd au lieu d'Eclipse IDE. Je vais montrer les étapes que j'ai utilisées pour trouver les erreurs pour le code et enfin les corriger. Le plugin DLTK n'est pas en faute ici. Le fichier de module et le script de test se trouvent dans le même dossier.

LESSON - Le nom du module et le nom de la constante dans les modules DOIVENT commencer par une majuscule. Pourquoi, je ne sais pas.

aModule.rb

module aModule 
aConstant = 7 
end 

test.rb

require 'aModule' 
puts aModule::aConstant 

cmd: cd dans le dossier test.rb et ruby Test.rb erreur: `` require ': ne peut pas charger un tel fichier - tokenizer.rb (LoadError) ` aide:Ruby 'require' error: cannot load such file

Ruby 1.9 has removed the current directory from the load path, and so you will need to do a relative require on this file, as Pascal says:

require './tokenizer' 

There's no need to suffix it with .rb, as Ruby's smart enough to know that's what you mean anyway.

J'ai fait les modifications suivantes:

test.rb

require './aModule' 
puts aModule::aConstant 

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

J'ai fait les modifications suivantes:

aModule.rb

module AModule # capital 
aConstant = 7 
end 

test.rb

require './AModule' 
puts AModule::aConstant 

cmd: Test de rubis.rb erreur:undefined method 'aConstant' for AModule:Module (NoMethodError) aide: Utilisé le lien ci-dessus. Je pense que constant doit aussi être nommé avec capital.

Code de travail final:

aModule.rb

module AModule # capital 
AConstant = 7 # capital 
end 

test.rb

require './AModule' 
puts AModule::AConstant 

WTF est Ruby comme ça ??? Et pourquoi ai-je besoin d'ajouter ./ avant un nom de module quand il est dans le même dossier que le script de test?

+1

'. /' Expliqué [ici] (http://stackoverflow.com/questions/2900370/why-does-ruby-1-9-2-remove-from-load-path-and-whats-the-alternative) – user2422869

Questions connexes