2010-11-10 12 views
9

Ich programmiere zum ersten Mal in Schienen springen und während für einige Bibliotheken Blick auf den Code ich heruntergeladen haben, ich den Code gelegentlich bemerken:Kann mir jemand bitte Klasse << selbst erklären?

class << self 
    def func 
    stuff 
    end 
end 

ich für eine Erklärung versucht haben, das Web, , aber die < < wird von den meisten nützlichen Suchmaschinen entfernt, so dass es am Ende nur für die Suche nach Klasse selbst, die nicht sehr nützlich ist. Jeder Einblick würde geschätzt werden.

+2

Google ist nicht eine nützliche Suchmaschine? http://www.google.com/search?source=ig&hl=de&rlz=&=&q=class+%3C%3C+self&btnG=Google+Search – McKay

+0

@McKay: Abgesehen von http://forums.pragprog.com/forums/77/topics/657, was nicht ganz das war, was Wade tat, welche Treffer waren für Wades Frage relevant? –

+0

Die ersten beiden Treffer sind beide relevant (das dritte wohl so). Der zweite Link (http://www.thekode.net/blog/blog.html) spricht speziell über dieses Idiom und verlinkt: http://www.thekode.net/ruby/techniques/DefiningMethodsWithClosures.html was auch sein könnte Hilfe. – McKay

Antwort

12

In Ruby, öffnet class << foo bis die Singletonklasse des Objekts durch foo verwiesen. In Ruby ist jedem Objekt eine Singleton-Klasse zugeordnet, die nur eine einzige Instanz hat. Diese Singleton-Klasse enthält objektspezifisches Verhalten, d.h. Singleton-Methoden.

So, class << self öffnet die Singleton-Klasse von self. Was genau selfist, hängt von dem Kontext ab, in dem Sie sich befinden, natürlich. In einem Modul- oder Klassendefinitionskörper ist es beispielsweise das Modul oder die Klasse selbst.

Wenn Sie die Singleton-Klasse nur für Singleton-Methoden verwenden, gibt es dafür eine Verknüpfung: def foo.bar.

Hier ist ein Beispiel dafür, wie Singleton-Methoden zu verwenden, um einige „Verfahren“ zu schaffen, die wirklich keine Verbindung mit einer bestimmten Instanz haben:

class << (Util = Object.new) 
    def do_something(n) 
    # ... 
    end 
end 

Util.do_something(n) 
+0

Also ist es im Grunde die Art, wie Ruby behandelt, was eine statische Methode in einer Sprache wie Java wäre? Gibt es Unterschiede? –

+0

@Wade - der Def-Teil ist wie eine statische Methode, ja. Aber Sie können Variablen auf Klassenebene innerhalb des offenen Endblocks der offenen Klasse manipulieren und andere dynamische Dinge auch dort tun. Rubys Klassendefinitionen werden ausgeführt, nicht statisch gelesen. Zum Beispiel können Sie dort andere Methoden auf Klassenebene ausführen und dort andere Klassen definieren. –

2

Es ist das Äquivalent von

def self.func 
    stuff 
end 

Abgesehen davon, dass alle Methoden darin verschachtelt sind Klassenmethoden. Es erlaubt Ihnen, eine Anzahl von Methoden als Klassenmethoden zu deklarieren, ohne jedes unter self zu deklarieren.

+0

Es ist gut für mehr als nur Klassenmethoden. – Chuck

+0

Stimmt, aber das ist der übliche Fall. –

Verwandte Themen