Qu’est-ce qu’une méthode privée dans Ruby?
C’est un type de méthode que vous ne pouvez appeler QUE depuis l’intérieur de la classe où il est défini.
Cela vous permet de contrôler l’accès à vos méthodes.
Une méthode Ruby peut être:
- privé
- public (par défaut)
- protégé
Par défaut, TOUTES vos méthodes sont public
.
Tout le monde peut les utiliser!
Mais vous pouvez changer cela en créant une méthode private
ou protected
.
Pourquoi est-ce utile?
Parce que vous pouvez rendre ces méthodes plus faciles à modifier.
Imaginez que vous écrivez une bibliothèque de code qui va être utilisée dans quelques projets différents au travail.
Lorsque ces projets implémentent votre bibliothèque, ils vont appeler des méthodes sur les classes que vous avez créées.
Maintenant:
Vous publiez une nouvelle version
Mais vous avez décidé de changer le nom sur une méthode public
.
Cela va produire des erreurs sur chaque projet qui utilise cette méthode!
Rappelez-vous ceci:
En ayant MOINS de méthodes publiques, vous AUGMENTEZ la liberté de changement au sein de votre classe.
Voyons quelques exemples de code !
Comprendre les méthodes privées dans Ruby
Avez-vous déjà vu le message d’erreur « méthode privée appelée »?
Celui-ci:
self.puts 123# NoMethodError: private method `puts' called
Ensuite, vous avez essayé d’utiliser une méthode private
de manière incorrecte.
Vous ne pouvez utiliser une méthode privée que par elle-même.
Exemple:
puts 123
C’est la même méthode, mais il faut l’appeler comme ça.
Les méthodes privées sont toujours appelées dans le contexte de self
.
En d’autres termes…
Vous ne pouvez utiliser des méthodes privées qu’avec:
- Autres méthodes de la même classe
- Méthodes héritées de la classe parente
- Méthodes incluses à partir d’un module
Cela signifie que vous ne pouvez pas appeler de méthodes privées à partir de l’extérieur de la classe qui les définit.
Car cela nécessiterait un « récepteur explicite ».
Sauf si…
Vous utilisez une méthode comme send
pour contourner cette règle.
send(:puts, "apple")
Comment définissez-vous une méthode private
?
def bacon "private bacon"endprivate :bacon
Le mot private
lui-même n’est pas un mot-clé, c’est une méthode définie sur le module Kernel
.
Où placer Vos Méthodes privées
Il est normal qu’une classe ait plus d’une méthode privée.
Où placez-vous ces méthodes?
Faites ceci:
class Food def public_method end private def bacon end def orange end def coconut endend
Chaque méthode d’instance après private
devient une méthode privée.
Vous pouvez utiliser
private_class_method :method_name
si vous souhaitez définir une méthode de classe comme privée
Il est courant de définir d’abord toutes vos méthodes publiques, puis de définir vos méthodes private
ensemble à la fin de la classe.
Méthodes publiques
Public est la visibilité de la méthode par défaut dans Ruby.
Voici un exemple:
def orange "Vitamin C"end
Si vous avez un objet food
qui définit orange
, vous pouvez l’appeler comme ceci:
food.orange
Si une méthode a été rendue privée ou protégée, vous pouvez la rendre publique à nouveau.
public :orange
Qu’est-ce qu’Une Méthode Protégée ?
Les méthodes protégées sont moins courantes.
Ce sont comme des méthodes private
, mais vous pouvez les appeler sur un objet & pas seulement directement.
Si vous essayez cet exemple avec private, vous obtiendrez une erreur:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
Vous obtenez l’erreur car name
serait privé, vous ne pouvez donc pas faire other.name
.
Mais avec protected
ce code fonctionne!
Méthodes privées vs protégées
C’est la différence, le fait que protected
conserve la méthode private
, mais cela vous permet également d’appeler cette méthode sur un objet.
Avec privé, vous ne pouvez faire que name
, avec protégé, vous pouvez faire object.name
.
Quand devriez-vous utiliser protected?
Uniquement si vous avez un cas très spécifique, comme la méthode equals (==
).
La documentation Ruby recommande d’utiliser private
au lieu de protected
dans la mesure du possible.
Et il y a cette note:
» Une méthode protégée est lente car elle ne peut pas utiliser de cache en ligne. »
J’étais curieux à ce sujet alors j’ai couru quelques repères:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
C’est une différence de performance de 8,5%.
Tutoriel vidéo
Résumé
Vous avez appris sur la visibilité de la méthode Ruby, les méthodes protégées publiques et privées &. Ce ne sont pas des mots-clés Ruby, ce sont des méthodes elles-mêmes définies sur la classe Module
.