2013-02-17 14 views
7

In Bezug auf:Was bedeutet Klasse << selbst?

class Test 
    class << self 
    def hi 
     puts "Hi there" 
    end 
end 

ich mit folgendem Bild in meinem Kopf kam:

Da alles in Ruby ein Objekt ist, Klassen selbst sind Objekte der Klasse Class. Mit dem Aufruf class << self öffnen Sie Class Definition von innen Test und injizieren wenige Instanzmethoden. Da Test eine Instanz von Class ist, können Sie diese Methoden genauso aufrufen, wie Sie Instanzenmethoden für Ihre Objekte aufrufen: Test.hi.

Im Folgenden ist der Pseudo-Code, der meinen vorherigen Satz zu visualisieren hilft:

class Class 
    def hi 
     puts “Hi there” 
    end 
end 

Test = Class.new(class Test 
end) 
Test.hi 

Bin ich dieses Recht zu bekommen?

Antwort

4

Angenommen, wir haben ein Objekt obj der Klasse A. An diesem Punkt, der Vorfahr Hierarchie der obj ‚s-Klasse ist:

[A, ...] 

Was class << obj; ... end tut, ist, dass es eine Klasse B deren einzige Instanz ist obj, und legt sie in die Vorfahren Hierarchie von obj so dass der Vorfahr schafft Hierarchie der obj ‚s-Klasse wird:

[B, A, ...] 

Wenn Sie class << self; ... end im Rahmen der Test schreiben, dann wird der Körper es wird eine Klasse sein, deren einzige Instanz ist Test. Wenn Sie innerhalb dieses Körpers eine Instanzmethode hi definieren, gilt dies für Instanzen dieser Klasse, nämlich Test. Daher können Sie Test.hi tun.

+0

Also was Sie sagen, ist im Grunde, anstatt 'Class' zu ändern, erstellt Ruby eine anonyme Klasse, die von' Class' erbt und hat 'hi' Methode definiert, und ist Klasse von' Test' Objekt? – spacemonkey

+0

Ja. Das ist richtig. – sawa

+0

Schön, das endlich zu knacken. Vielen Dank! – spacemonkey