Ruby (et Rails) imbriquée module de syntaxe
Je me demandais quelle est la différence entre les deux modules suivants
# First Example
module Parent
module Child
end
end
et
# Second Example
module Parent::Child
end
À l'aide de la 2e méthode, il semble que le module Parent doit être défini précédemment, sinon je obtenir un "uninitialized constant' erreur
Compte tenu de cela, quel est le meilleur moyen de définir des modules tels que ce, puis en ajoutant imbriqués les enfants en ce qui concerne la syntaxe et de la structure du fichier (c'est à dire. les dossiers etc). Référence à l'un des Rails de chemin serait grandement apprécié.
Sont ces deux exemples pour toutes fins utiles, l'équivalent?
Vous devez vous connecter pour publier un commentaire.
Dans le premier exemple, il définit les
Parent
module, puis leChild
module. Le deuxième exemple, comme vous le dites vous-même, doit avoir laParent
module défini avant de la main. Au détriment d'une ligne de code, vous assurer que le module que vous êtes d'imbrication de sous à l'aide de votre premier exemple est toujours va être défini.Pour Rails exemple, nous allons regarder dans la railties/lib/rails/moteur.rb fichier qui ré-ouvre le
Rails
module et puis définit unMoteur
de la classe à l'intérieur. Cela aurait pu être fait simplement par:Mais au lieu de cela, peut-être pour les raisons indiquées ci-dessus et peut-être aussi par souci de clarté, le module est défini d'abord, puis à l'intérieur d'une classe.
Je préfère la deuxième méthode (si je suis sûr que le Parent est déjà définie) car il a l'air propre, de l'esp. lors de la nidification est très profond.
Cependant la 1ère méthode a des avantages, on a pas encore discuté, c'est que imbriquée module obtient l'accès à tout sur le plan lexical constantes disponibles dans l'affichage de module.
En général, vous ne voulez pas définir un module à l'aide du module Parent: Enfant:de la syntaxe à moins que vous pouvez être absolument certain que le Parent est déjà là. Un sous-Module ne peut être définie à l'aide de l' :: syntaxe si le module parent est défini. Dans votre exemple, si vous effectuez les opérations suivantes, vous n'obtiendrez pas une uninitialized constant d'erreur.
Il semble que la Rampe d'escalier, la réponse est aussi la raison de ce comportement:
Le module intérieur A est une constante à l'intérieur de l'extérieur du module A, et donc il n'est pas visible à l'aide de la seconde méthode.
Édition de mon commentaire précédent:
Ceci est expliqué en 7.9 "Constante Recherche de" de "Du Langage de Programmation Ruby" (Première Édition). La partie pertinente ici est de Module.de nidification, qui ne contient pas le module extérieur dans le deuxième exemple, donc ne peut être trouvé dans la portée globale.