Qu'est - ce que class << self
faire dans Ruby ?
ruby
metaclass
eigenclass
singleton
randombits
la source
la source
Réponses:
Premièrement, la
class << foo
syntaxe ouvrefoo
la classe singleton de (classe propre). Cela vous permet de spécialiser le comportement des méthodes appelées sur cet objet spécifique.Maintenant, pour répondre à la question:
class << self
ouvreself
la classe singleton de sorte que les méthodes puissent être redéfinies pour l'self
objet courant (qui à l'intérieur d'un corps de classe ou de module est la classe ou le module lui-même ). Habituellement, ceci est utilisé pour définir des méthodes de classe / module ("statiques"):Cela peut également être écrit comme un raccourci:
Ou encore plus court:
Dans une définition de fonction,
self
fait référence à l'objet avec lequel la fonction est appelée. Dans ce cas,class << self
ouvre la classe singleton pour cet objet; une utilisation de cela est d'implémenter la machine d'état d'un pauvre:Ainsi, dans l'exemple ci-dessus, chaque instance de
StateMachineExample
a unprocess_hook
alias pourprocess_state_1
, mais notez comment dans ce dernier, elle peut redéfinirprocess_hook
(pourself
seulement, sans affecter les autresStateMachineExample
instances)process_state_2
. Ainsi, chaque fois qu'un appelant appelle laprocess
méthode (qui appelle la redéfinissableprocess_hook
), le comportement change en fonction de son état.la source
class << self
, pour créer des méthodes de classe / module. Je développerai probablement cette utilisationclass << self
, car c'est une utilisation beaucoup plus idiomatique.a
la classe 'ssingleton_class
puisquea
' (après avoir changéinspect
) est une variante unique de laString
classe. S'il modifiait laString
classe singleton , cela affecterait toutes les autresString
instances. Ce qui est plus étrange encore que si vous ouvrez à nouveau plus tardString
pour redéfinirinspect
ensuitea
ramassera encore les nouveaux changements.class << self
signifie- t -il autre chose que la valeur deself
est définie égale à la classe singleton dans la portée du bloc?J'ai trouvé une super explication simple à propos
class << self
,Eigenclass
et différents types de méthodes.Dans Ruby, il existe trois types de méthodes qui peuvent être appliquées à une classe:
Les méthodes d'instance et les méthodes de classe sont presque similaires à leurs homonymes dans d'autres langages de programmation.
Une autre façon d'accéder à un
Eigenclass
(qui inclut des méthodes singleton) est avec la syntaxe suivante (class <<
):vous pouvez maintenant définir une méthode singleton pour
self
laquelle est la classeFoo
elle - même dans ce contexte:la source
foo.singleton_class.instance_methods(false)
pour vérifier.Habituellement, les méthodes d'instance sont des méthodes globales. Cela signifie qu'ils sont disponibles dans toutes les instances de la classe sur laquelle ils ont été définis. En revanche, une méthode singleton est implémentée sur un seul objet.
Ruby stocke les méthodes dans les classes et toutes les méthodes doivent être associées à une classe. L'objet sur lequel une méthode singleton est définie n'est pas une classe (c'est une instance d'une classe). Si seules les classes peuvent stocker des méthodes, comment un objet peut-il stocker une méthode singleton? Lorsqu'une méthode singleton est créée, Ruby crée automatiquement une classe anonyme pour stocker cette méthode. Ces classes anonymes sont appelées métaclasses, également appelées classes singleton ou classes propres. La méthode singleton est associée à la métaclasse qui, à son tour, est associée à l'objet sur lequel la méthode singleton a été définie.
Si plusieurs méthodes singleton sont définies dans un même objet, elles sont toutes stockées dans la même métaclasse.
Dans l'exemple ci-dessus, la classe << z1 modifie le self actuel pour pointer vers la métaclasse de l'objet z1; ensuite, il définit la méthode say_hello dans la métaclasse.
Les classes sont également des objets (instances de la classe intégrée appelée Classe). Les méthodes de classe ne sont rien de plus que des méthodes singleton associées à un objet de classe.
Tous les objets peuvent avoir des métaclasses. Cela signifie que les classes peuvent également avoir des métaclasses. Dans l'exemple ci-dessus, la classe << self modifie self afin qu'elle pointe vers la métaclasse de la classe Zabuton. Lorsqu'une méthode est définie sans récepteur explicite (la classe / l'objet sur lequel la méthode sera définie), elle est implicitement définie dans la portée actuelle, c'est-à-dire la valeur actuelle de self. Par conséquent, la méthode stuff est définie dans la métaclasse de la classe Zabuton. L'exemple ci-dessus est juste une autre façon de définir une méthode de classe. À mon humble avis, il est préférable d'utiliser la syntaxe def self.my_new_clas_method pour définir les méthodes de classe, car elle rend le code plus facile à comprendre. L'exemple ci-dessus a été inclus afin que nous comprenions ce qui se passe lorsque nous rencontrons la classe << self syntax.
Des informations supplémentaires peuvent être trouvées à ce poste sur les classes Ruby .
la source
Quelle classe << chose fait:
[il fait
self == thing.singleton_class
dans le cadre de son bloc] .Qu'est-ce que thing.singleton_class?
hi
l'objet hérite de son#methods
de#singleton_class.instance_methods
puis de son#class.instance_methods
.Ici, nous avons donné
hi
la méthode d'instance de classe singleton:a
. Cela aurait pu être fait avec la classe << hi à la place.hi
's#singleton_class
a toutes les méthodes d'instancehi
est#class
a, et peut - être un peu plus (:a
ici).[les méthodes d'instance de chose
#class
et#singleton_class
peuvent être appliquées directement à chose. quand ruby voit thing.a, il cherche d'abord: une définition de méthode dans thing.singleton_class.instance_methods puis dans thing.class.instance_methods]Soit dit en passant - ils appellent de l' objet classe singleton == métaclasse == eigenclass .
la source
Une méthode singleton est une méthode qui n'est définie que pour un seul objet.
Exemple:
Méthodes Singleton de SomeClass
tester
Méthodes de singleton de test_obj
test_2
test_3
la source
En fait, si vous écrivez des extensions C pour vos projets Ruby, il n'y a vraiment qu'une seule façon de définir une méthode Module.
Je sais que cette auto-entreprise ouvre simplement toutes sortes d'autres questions afin que vous puissiez faire mieux en recherchant chaque partie.
Objets d'abord.
Puis-je faire une méthode pour foo?
Sûr
Que dois-je en faire?
Juste un autre objet.
Vous obtenez toutes les méthodes Object plus votre nouvelle.
Juste l'objet foo.
Essayez de voir ce qui se passe si vous créez des objets à partir d'autres objets comme la classe et le module. Les exemples de toutes les réponses sont agréables à jouer, mais vous devez travailler avec différentes idées ou concepts pour vraiment comprendre ce qui se passe avec la façon dont le code est écrit. Alors maintenant, vous avez beaucoup de termes à examiner.
Singleton, Class, Module, self, Object et Eigenclass ont été évoqués mais Ruby ne nomme pas les modèles d'objet de cette façon. Cela ressemble plus à Metaclass. Richard ou __pourquoi vous montre l'idée ici. http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html Et si le vous épate, essayez de rechercher Ruby Object Model dans la recherche. Dave Thomas et Peter Cooper sont deux vidéos que je connais sur YouTube. Ils essaient aussi d'expliquer ce concept. Dave a mis du temps à l'obtenir, alors ne vous inquiétez pas. J'y travaille toujours aussi. Sinon, pourquoi serais-je ici? Merci pour ta question. Jetez également un œil à la bibliothèque standard. Il a un module Singleton tout comme un FYI.
C'est plutôt bien. https://www.youtube.com/watch?v=i4uiyWA8eFk
la source