Ruby: Est-il possible de définir une méthode de classe dans un module?
Dire il y a trois classes: A
, B
& C
. Je veux que chaque classe à une méthode de classe, dire self.foo
, qui a exactement le même code pour A
, B
& C
.
Est-il possible de définir self.foo
dans un module et d'inclure ce module dans A
, B
& C
? J'ai essayé de le faire et a obtenu un message d'erreur disant que foo
n'est pas reconnu.
- Ruby n'a pas vraiment d'avoir un concept de méthodes statiques. En ruby, toutes les méthodes ont un objet récepteur. Cela peut être une méthode qui arrive à avoir un
class
deClass
ouModule
.
Vous devez vous connecter pour publier un commentaire.
Ou, vous pouvez étendre les classes par la suite:
foo
une méthode d'instance de A, B, et C, dans ce cas ?foo
est la classe de la méthode d'instance. Vous l'appelez, avec la classe en tant que récepteur:A.foo
. Depuis Un est des méthodes d'instance, vous pouvez également utiliserself.class.foo
.class A; extend Common; end
est équivalent àclass A; singleton_class.include Common; end
.Yep
Une remarque que je dois ajouter - si le module va être TOUTES les méthodes de la classe - mieux simplement à l'aide de
extend ModuleName
dans le Modèle et la définition des méthodes directement dans le module au lieu - plutôt que d'avoir un ClassMethods module à l'intérieur du Module, à laRails 3 introduit un module nommé
ActiveSupport::Concern
qui a pour objectif de simplifier la syntaxe de modules.Il nous a permis de gagner quelques lignes de "standard" de code dans le module.
C'est de base rubis mixin des fonctionnalités ruby si spécial.
Alors que
extend
tourne méthodes de module dans les méthodes de la classe,include
tourne méthodes de module dans les méthodes d'instance de la y compris/l'extension de la classe ou du module.include
etextend
.Juste voulu étendre Oliver répondre
Définir les méthodes de la Classe et les méthodes d'instance ensemble dans un module.