2011-01-10 41 views
12

duplicados posibles:
class << self idiom in Ruby
Can someone please explain class << self to me?¿Qué significa "class << self" en Rails?

Me gustaría saber qué significa class << self declaración en una clase de modelo? ¿Y cómo difiere la afirmación que contiene de las que están fuera de ella? Por ejemplo:

class Post < ActiveRecord::Base 

    class << self 
    def search(q) 
      # search from DB 
    end 
    end 
    def search2(qq) 
     # search from DB 
    end 
end 

¿Qué significa class << self?

¿Cuáles son las diferencias entre el método search(q) y search2(qq)?

+0

search2 es un nombre de método muy pobre. –

+0

Y también un duplicado de [Rails class << self] (http://stackoverflow.com/questions/2567956/rails-class-self) y [Diferencia entre 'self.method_name' y 'class << self' en Ruby ] (http: // stackoverflow.com/questions/2025569/difference-between-self-method-name-and-class-self-in-ruby) y [¿Puede alguien explicar la clase << self to me?] (http://stackoverflow.com/questions/4149700/can-alguien-por-favor-explique-clase-self-to-me). Por favor busca antes de publicar preguntas. – Phrogz

Respuesta

22

Eso es lo mismo que

class Post < ActiveRecord::Base 

    def self.search(q) 
    # Class Level Method 
    # search from DB 
    end 

    def search2(qq) 
    # Instance Level Method 
    # search from DB 
    end 
end 

Los métodos de clase trabajan en la clase (por ejemplo, Post), los métodos de instancia trabaja en instancias de esa clase (por ejemplo, correos. nuevo)

A algunas personas les gusta la forma class << self; code; end; porque mantiene todos los métodos de nivel de clase en un bloque agradable y en un solo lugar.

A otros les gusta prefijar cada método con self. para saber explícitamente que es un método de clase, no un método de instancia. Es una cuestión de estilo y cómo codificas. Si coloca todos los métodos de clase en un bloque como class << self, y este bloque es lo suficientemente largo, la línea class << self podría estar fuera de la vista del editor, lo que dificultaría saber que se encuentra en el bloque de instancia de la clase.

Por otro lado, prefijar cada método con self. e intercalar aquellos con métodos de instancia también es una mala idea, ¿cómo se conocen todos los métodos de clase mientras se lee el código?

Elija un idioma que prefiera para su propia base de código, pero si trabaja en un proyecto de código abierto o colabora con el código de otra persona, use la regla de formato del código.

1

Crea métodos de clase en lugar de métodos de instancia. Es lo mismo que hacer def self.search(q). Estos dos métodos se denominan como:

Post.search(q) 
Post.new.search(qq) 
0

search2 es un método de instancia, mientras que search es un método de clase. La sintaxis class << self le permite agrupar los métodos de clase a continuación. Hay tres formas de definir los métodos de clase en Ruby:

class MyClass 
    def self.method 
     # do sth. 
    end 

    def MyClass.method2 
     # do sth. 
    end 

    class << self 
     def method3 
      # do sth. 
     end 

     def another_class_method 
      # do sth. 
     end 
    end 
end 

Los métodos de clase se invocan en una clase, no en una instancia. Es una preferencia personal cuál de las tres expresiones idiomáticas quiere usar. Prefiero def self.method sin ningún motivo en particular.

Cuestiones relacionadas