2011-01-10 17 views
12

mögliche Dubletten:
class << self idiom in Ruby
Can someone please explain class << self to me?Was bedeutet "class << self" in Rails?

Ich möchte wissen, was macht class << self-Anweisung in einer Modellklasse bedeuten? Und wie unterscheidet sich die Aussage darin von denen außerhalb davon? Zum Beispiel:

class Post < ActiveRecord::Base 

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

Was bedeutet class << self?

Was sind die Unterschiede zwischen Methode search(q) und search2(qq)?

+0

search2 ist ein sehr schlechter Methodenname. –

+0

Und auch ein Duplikat von [Rails class << self] (http://stackoverflow.com/questions/2567956/rails-class-self) und [Differenz zwischen 'self.method_name' und 'class' self 'in Ruby ] (http: // Stapelüberlauf.com/questions/2025569/difference-zwischen-self-method-name-und-klasse-self-in-ruby) und [Kann mir jemand bitte erklären << selbst zu mir?] (http://stackoverflow.com/questions/4149700/can-someone-bitte-erklären-class-self-to-me). Bitte suchen Sie, bevor Sie Fragen stellen. – Phrogz

Antwort

22

Das ist die gleiche wie

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 

Klasse Methoden für die Klasse arbeiten (zB Post), Instanzmethoden arbeitet auf Instanzen dieser Klasse (zB Post. neu)

Einige Leute mögen die class << self; code; end; Art und Weise, weil es alle Klassenmethoden in einem schönen Block und an einem Ort hält.

Andere bevorzugen jede Methode mit self., um explizit zu wissen, dass dies eine Klassenmethode und keine Instanzmethode ist. Es ist eine Frage des Stils und wie Sie programmieren. Wenn Sie alle Klassenmethoden in einen Block wie class << self einfügen und dieser Block lang genug ist, könnte die Zeile class << self außerhalb Ihrer Editor-Ansicht liegen, was es schwierig macht zu wissen, dass Sie sich im Klasseninstanzblock befinden.

Auf der anderen Seite ist es auch eine schlechte Idee, jeder Methode self. voranzustellen und sie mit Instanzmethoden zu vermischen. Wie können Sie alle Klassenmethoden beim Lesen Ihres Codes kennen?

Wählen Sie ein Idiom aus, das Sie für Ihre eigene Codebasis bevorzugen. Wenn Sie jedoch an einem Open Source-Projekt arbeiten oder an einem anderen Code arbeiten, verwenden Sie deren Regel zur Codeformatierung.

1

Es erstellt Klassenmethoden im Gegensatz zu Instanzmethoden. Es ist das gleiche wie def self.search(q) zu tun. Diese beiden Methoden würden wie genannt werden:

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

search2 ist eine Instanz-Methode, während search eine Klassenmethode ist. Die class << self Syntax ermöglicht es Ihnen, Klassenmethoden zu gruppieren. Es gibt drei Möglichkeiten, Klassenmethoden in Ruby zu definieren:

Klassenmethoden werden für eine Klasse und nicht für eine Instanz aufgerufen. Es ist persönliche Präferenz, welche der drei Idiome Sie verwenden möchten. Ich bevorzuge def self.method ohne besonderen Grund.