2009-05-19 10 views
9

John Nunemaker recientemente escribió en su blog acerca de la various ways to define class methods en Ruby, dando a estas tres alternativas:¿Cómo prefieres definir los métodos de clase en Ruby?

# Way 1 
class Foo 
    def self.bar 
    puts 'class method' 
    end 
end 

# Way 2 
class Foo 
    class << self 
    def bar 
     puts 'class method' 
    end 
    end 
end 

# Way 3 
class Foo; end 
def Foo.bar 
    puts 'class method' 
end 
  • ¿Cuál es su mejor forma de hacer esto?
  • ¿Prefiere algo distinto a los anteriores?
  • Si usa más de una forma, ¿bajo qué circunstancias las usa?

Respuesta

12

utilizo constantemente Camino 1:

class Foo 
    def self.bar 
    puts 'class method' 
    end 
end 

No es prolijo, y se mantiene el método en el mismo contexto de la clase.

1

Prefiero la Forma 1 ya que no es sensible al contexto. No me gusta saltar al medio de un archivo y luego tener que desplazarme hacia arriba o hacia abajo para ver si la sangría significa que estoy en un bloque class << self o si solo se trata de un módulo anidado.

0

Veo < < por agregar un método como demasiado inusual (aunque felizmente uso < < con cadenas y IO).

Evito Foo.bar porque significa repetirse.

1

De acuerdo con la mayoría de los usuarios. Que tienden a utilizar principalmente el

# Way 1 
class Foo 
    def self.bar 
    puts 'class method' 
    end 
end 

Hay algunas pequeñas diferencias, si no recuerdo mal, que se muestran en los pragmáticos conversaciones programadores metaprogramming (que recomiendo), que se refieren a la forma en que el código de la clase se llama y ejecutado .

Sin embargo, eran bastante pequeñas y la mayoría de las cosas no tendrían que tratarse de manera normal. Veré si puedo verificarlos y publicarlos.

0

Uso Way # 3, pero creo que Way # 1 también es genial. Depende de tu uso. Si desea que su código se "corte/prepareble" en otros módulos y clases, entonces la Forma # 1 es mejor. Yo uso Camino # 3 para realmente hacerlo más del dolor de cortar/pegar código, b/c mantra de Ruby es "no repita a sí mismo" por lo que no debe cortar/pegar código muy a menudo ..

3

por lo general prefiera def self.foo para métodos individuales, y class << self para tramos largos de métodos de clase. Siento que hace que la distinción entre la parte del método de clase y el método de instancia sea parte de la definición de la clase.

Cuestiones relacionadas