Comme indiqué ci-dessus, les deux styles semblent être équivalents, mais en utilisant class << self
permet de marquer les méthodes de classe comme private
ou protected
.Par exemple:
class UsingDefSelf
def self.a; 'public class method'; end
private
def self.b; 'public class method!'; end
end
class UsingSingletonClass
class << self
def a; 'public class method'; end
private
def b; 'private class method'; end
end
end
private
affecte uniquement les méthodes d'instance. En utilisant la classe singleton, nous définissons des méthodes d'instance de cette classe, qui se transforment en méthodes de classe de la classe contenant!
Nous pouvons également marquer les méthodes de classe comme private
avec def self
:
class UsingDefSelf
def self.a; 'private class method'; end
def self.b; 'private class method!'; end
private_class_method :a, :b
# In Ruby 2.1 there is an alternative syntax
private_class_method def self.c; 'private class method!'; end
end
Mais nous ne pouvons pas les marquer comme protected
, il n'y a pas protected_class_method
. (Cependant, puisque class est la seule instance de sa singletonclass, la méthode de classe privée et les méthodes de classe protégée sont presque identiques, sauf que leur syntaxe d'appel est différente.)
De même, il est moins facile que d'utiliser class << self
pour marquer les méthodes de classe private
, puisque vous devez lister tous les noms de méthode dans private_class_method
ou préfixer private_class_method
à chaque définition de méthode de classe privée.
Il est difficile de prendre au sérieux une suggestion de style s'il n'y a pas d'explication, n'est-ce pas? –
Notez qu'il est indiqué "_C'est un guide que nous utilisons pour nos propres applications Ruby en interne chez GitHub._" C'est-à-dire, c'est le style que Github a défini pour son propre usage. Ce n'est pas un guide définitif pour corriger le style Ruby. –
Je suis d'accord, mais semble être écrit par des rubisistes bien formés avec des compétences d'autorité. –