Pourquoi serions-nous mettre un module à l'intérieur d'une classe de Ruby?
En Ruby, je vois qu'il peut être utile de placer des classes à l'intérieur de modules pour l'amour de namespacing. Je vois aussi qu'il est possible de placer des modules à l'intérieur des classes. Mais je ne vois pas pourquoi tu ferais ça.
Modules sont généralement mélangés dans les classes, à droite? Donc, quel serait le but de la définition d'un module à l'intérieur d'une classe?
- Modèle est trouvé dans Lita ChatOps classe de Gestionnaire. github.com/litaio/lita/blob/master/lib/lita/handler/common.rb
Vous devez vous connecter pour publier un commentaire.
Que nous puissions l'utiliser lors de l'écriture des grands singes comme le code comme ceci:
Un autre exemple qui serait plus pratique dans le monde réel est d'avoir mixin qui sont appliquées uniquement par les sous-classes.
Ceci est utile lorsque certains facettes d'une chose s'applique à certaines sous-classes et d'autres facettes de s'appliquer à d'autres sous-classes, sans qu'il y ait assez d'ordre dans la façon dont ces aspects s'appliquent pour faire place à une claire hiérarchie de classe (de l'arbre). Penser à l'héritage multiple! Un exemple simplifié:
Et ainsi de suite. Une sorte de gentil, lorsqu'il est utilisé judicieusement. Même super les appels et les constructeurs (je n'ai pas de définir ici si), le flux à travers tout le mixin et les classes de la façon dont je veux qu'ils.
Depuis, j'ai couru dans un cas d'utilisation dans une grande application Rails avec complexe namespacing. Un exemple simplifié:
Ici
Invoice
est une classe à part, mais est aussi un bon espace de noms pour ses éléments dépendants. On ne peut pas diremodule Invoice
parce que la constante est déjà défini comme une classe, mais on peut toujours l'utiliser comme un espace de noms.Géant De Mise En Garde
Si vous utilisez une classe comme un espace de noms, et vous êtes à l'aide de Rails, assurez-vous de de ne pas accidentellement déclarer qu'ailleurs la classe. Chargement automatique va ruiner votre journée. Par exemple:
Le fait que
class Invoice
est indiqué dans ce fichier génère une charge de l'ordre de la dépendance; si ce fichier estclass Invoice
ligne est exécutée avant votre définition de classe, votre définition de classe peut ne pas fonctionner correctement. Dans cet exemple, je ne peux pas déclarer queInvoice
sublcassesActiveRecord::Base
siInvoice
a déjà été déclaré sans classe parent.Vous pourrait besoin de votre "vrai" fichier de définition de classe au-dessus d'un autre fichier, mais au moins dans un des Rails de chargement automatique scénario, vous aurez moins de querelles de le faire si vous n'ceci à la place:
Avec cette syntaxe, Rails de voir le
Invoice
constante et l'utilisation de chargement automatique pour le chercher, le trouver dans votre fichier de modèle et de définir la façon dont vous le souhaitez.module Invoice::Dependents::ItemsHelper
), si vous voulez faire référence à d'autres classes dans leInvoice::Dependents
portée? Je suis la recherche je inclure le nom complet de la classe (Invoice::Dependents::OtherClass.method
), qui est fâcheusement détaillé.Je suppose que c'est vraiment juste sur l'utilisation d'une classe comme un espace de noms, ce qui est parfois plus pratique que de tout mettre dans un module. Je n'ai jamais vu que dans la pratique, mais il est parfaitement valide code Ruby de toute façon.
Le seul scénario de la vie réelle, je pense, à l'aide de EventMachine dans une classe: