82 votes

Que signifie le nom `def self.function`?

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 ?

111voto

BernardK Points 2950

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.

68voto

krichard Points 2036

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

14voto

kostja Points 20153

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X