2013-02-17 16 views
7

quanto riguarda:Che cosa significa class << self mean?

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

Sono venuto con seguente immagine nella mia testa:

Dal momento che tutto è un oggetto in Ruby, le classi stesse sono oggetti della classe Class. Chiamando class << self si apre la definizione Class dall'interno di Test e si introducono alcuni metodi di istanza. Poiché Test è un'istanza di Class, è possibile chiamare tali metodi allo stesso modo in cui si richiamano i metodi di istanza sugli oggetti: Test.hi.

Di seguito è riportato il codice pseudo che aiuta a visualizzare il mio precedente frase:

class Class 
    def hi 
     puts “Hi there” 
    end 
end 

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

mi appare questo diritto?

risposta

4

Supponiamo di avere un oggetto obj della classe A. A questo punto, la gerarchia antenato della classe obj s' è:

[A, ...] 

Cosa class << obj; ... end fa è che crea una classe B cui unico esempio è obj, e lo mette nella gerarchia antenato di obj in modo che l'antenato gerarchia di classe s' il obj diventa:

[B, A, ...] 

Se si scrive class << self; ... end nel contesto di Test, poi il corpo di esso sarà una classe il cui unico esempio è Test. Se si definisce un metodo di istanza hi all'interno di quel corpo, questo verrà applicato alle istanze di tale classe, ovvero Test. Quindi sarai in grado di fare Test.hi.

+0

Quindi quello che stai dicendo è fondamentalmente invece di modificare 'Class', Ruby crea una classe anonima, che eredita da' Class' e ha il metodo 'hi' definito, ed è una classe di oggetto' Test'? – spacemonkey

+0

Sì. È giusto. – sawa

+0

Bello finalmente rompere questo. Grazie! – spacemonkey

Problemi correlati