Quelqu'un pourrait-il m'expliquer ce que signifie l'ajout de self
à la définition de la méthode ? Est-ce similaire au mot-clé this
en java ?
Réponses
Trop de publicités?Contrairement à d'autres langages, Ruby n'a pas de méthodes de classe, mais il a des méthodes singleton attachées à un objet particulier.
cat = String.new("chat")
def cat.speak
'miaou'
end
cat.speak #=> "miaou"
cat.singleton_methods #=> ["speak"]
def cat.speak
crée une méthode singleton attachée à l'objet chat.
Lorsque vous écrivez class A
, cela équivaut à A = Class.new
:
A = Class.new
def A.speak
"Je suis la classe A"
end
A.speak #=> "Je suis la classe A"
A.singleton_methods #=> ["speak"]
def A.speak
crée une méthode singleton attachée à l'objet A. Nous l'appelons une méthode de classe de la classe A.
Lorsque vous écrivez
class A
def self.c_method
'dans A#c_method'
end
vous créez une instance de Class
(*). À l'intérieur de la définition de la classe, Ruby définit self sur cette nouvelle instance de Class, qui a été assignée à la constante A. Ainsi def self.c_method
équivaut à def cat.speak
, c'est-à-dire que vous définissez une méthode singleton attachée à l'objet self, qui est actuellement la classe A.
Maintenant, la classe A a deux méthodes singleton, que nous appelons couramment des méthodes de classe.
A.singleton_methods
=> ["c_method", "speak"]
(*) techniquement, dans ce cas où A
a déjà été créé par A = Class.new
, class A
rouvre la classe existante. C'est pourquoi nous avons deux méthodes singleton à la fin. Mais dans le cas habituel où c'est la première définition d'une classe, cela signifie Class.new
.
En ruby, 'self' est quelque peu similaire à this
en java, mais quand il s'agit de classes, c'est plus comme le mot-clé static
en java. Un court exemple :
class A
# méthode de classe
def self.c_method
true
end
# méthode d'instance
def i_method
true
end
end
A.c_method #=> true
A.i_method #=> échec
A.new.i_method #=> true
A.new.c_method #=> échec
Mise à jour: Différence entre les méthodes statiques en java et les méthodes de classe en ruby
Les méthodes statiques en Java ont deux caractéristiques distinctes qui les rendent différentes des méthodes d'instance : a) elles sont statiques, b) elles ne sont pas associées à une instance. (En d'autres termes: elles ne sont vraiment pas comme des méthodes du tout, ce ne sont que des procédures.) En Ruby, toutes les méthodes sont dynamiques, et toutes les méthodes sont associées à une instance. En fait, contrairement à Java où il existe trois types différents de "méthodes" (méthodes d'instance, méthodes statiques et constructeurs), il n'y a qu'un seul type de méthode en Ruby: les méthodes d'instance. Donc, non: les méthodes statiques en Java sont complètement différentes des méthodes en Ruby. - Jörg W Mittag il y a 1 heure
Lors de la déclaration d'une méthode, le self
de la déclaration est la classe/module déclarant, donc vous définissez effectivement une méthode de classe. Pour le client, cela fonctionne de manière similaire à une méthode static
en java. Le client appellerait la méthode sur la classe au lieu d'une instance: MaClasse.méthode
Ici vous pouvez trouver quelques détails supplémentaires sur les méthodes de classe et d'instance.
EDIT : Bien que le mot-clé self
soit semblable au mot-clé this
en java, les effets de l'utilisation de self
pour la déclaration de méthode de classe sont similaires à ceux de l'utilisation du mot-clé static
en java. La similarité est que les méthodes static en java, tout comme les méthodes de classe en ruby, sont accédées en utilisant l'objet de classe lui-même au lieu d'une instance de la classe.
Veuillez noter que static
ne signifie pas l'opposé de dynamique. Le choix du nom de ce mot-clé est discutable (probablement hérité de C) et aurait dû être plutôt appelé perClass
ou similaire pour mieux refléter la signification. La signification technique est que tous les membres static
existent une seule fois pour chaque classloader.