2011-01-10 23 views
12

Possibili duplicati:
class << self idiom in Ruby
Can someone please explain class << self to me?cosa significa "class << self" in Rails?

Mi piacerebbe sapere che cosa significa class << self dichiarazione in una classe del modello? E in che modo l'affermazione al suo interno differisce da quella al di fuori di essa. Ad esempio:

class Post < ActiveRecord::Base 

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

Che cosa significa class << self?

Quali sono le differenze tra il metodo search(q) e search2(qq)?

+0

search2 è un nome di metodo molto scarso. –

+0

E anche un duplicato di [Rails class << self] (http://stackoverflow.com/questions/2567956/rails-class-self) e [Differenza tra "self.method_name" e "class << self" in Ruby ] (http: // StackOverflow.it/questions/2025569/difference-between-self-method-name-and-class-self-in-ruby) e [Qualcuno può spiegare la classe << me stesso?] (http://stackoverflow.com/questions/4149700/can-qualcuno-please-spiegare-class-auto-per-me). Si prega di cercare prima di inviare domande. – Phrogz

risposta

22

Questo è lo stesso di

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 

I metodi di classe lavorano sulla classe (ad esempio Post), metodi di istanza opere su istanze di quella classe (ad esempio postali. nuovo)

Alcune persone amano il modo class << self; code; end; perché mantiene tutti i metodi di livello di classe in un blocco piacevole e in un unico punto.

Altri preferiscono precedere ciascun metodo con self. per sapere esplicitamente che è un metodo di classe non un metodo di istanza. È una questione di stile e di codice. Se si mettono tutti i metodi di classe in un blocco come class << self e questo blocco è abbastanza lungo, la riga class << self potrebbe essere fuori dalla vista dell'editor rendendo difficile sapere che si è nel blocco di istanze di classe.

D'altra parte, il prefisso di ogni metodo con self. e il mescolare quelli con i metodi di istanza è anche una cattiva idea, come si conoscono tutti i metodi di classe durante la lettura del codice.

Scegli un idioma che preferisci per il tuo codice personale ma se lavori su un progetto open source o collabori sul codice di qualcun altro, usa la loro regola di formattazione del codice.

1

Crea metodi di classe anziché metodi di istanza. È lo stesso di fare def self.search(q). Questi due metodi sarebbero stati chiamati come:

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

search2 è un metodo di istanza mentre search è un metodo di classe. La sintassi class << self consente di raggruppare i metodi di classe di seguito. Ci sono tre modi per definire metodi di classe in 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 

Class-metodi sono chiamati su una classe, non su un'istanza. È una preferenza personale quale dei tre idiomi desideri utilizzare. Preferisco def self.method per nessun motivo particolare.