Como se señaló anteriormente, ambos estilos parecen ser equivalentes, sin embargo, usar class << self
permite marcar los métodos de clase como private
o protected
.Por ejemplo:
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
solo afecta a los métodos de instancia. Usando la clase singleton, estamos definiendo métodos de instancia de esa clase, que se convierten en métodos de clase de la clase contenedora.
También puede marcar los métodos de clase como private
con 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
, pero no podemos marcarlos como protected
, no hay protected_class_method
. (Sin embargo, ya que la clase es el único caso de su SingletonClass, método de clase privada y métodos de clases protegidas son casi los mismos, excepto su llamado sintaxis es diferente.)
También es menos fácil que usar class << self
para marcar private
métodos de clase, ya que tiene que enumerar todos los nombres de métodos en private_class_method
o prefijo private_class_method
a cada definición de método de clase privada.
Es difícil tomar en serio una sugerencia de estilo si no hay una explicación que lo acompañe, ¿no es así? –
Tenga en cuenta que dice "_Esta es una guía que usamos para nuestras propias aplicaciones de ruby internamente en GitHub._" Es decir, este es el estilo que Github ha definido para su propio uso. No es una guía definitiva para corregir el estilo Ruby. –
Estoy de acuerdo, pero parece estar escrito a partir de Rubyists bien formados con habilidades de autoridad. –