2013-03-15 13 views
16

Sto studiando il modello di oggetti Ruby dal libro "Metaprogramming Ruby" e comprendo la nozione di come le classi siano anche gli oggetti.Ruby Object Model - antenati di una classe

class A 
end 

A.ancestors # => [A, Object, Kernel, BasicObject] 
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject] 

Quello che mi sono confuso circa è che quando ho inizialmente provato A.ancestors in irb, mi aspettavo i risultati che ho ottenuto in A.class.ancestors - mio processo di pensiero è stato: dal momento che A è una classe, e una classe è un'istanza di Class Class, il suo antenato è Class. Ma la classe non sembra essere un antenato di A.

Qualcuno sarebbe in grado di chiarire la mia confusione qui?

+1

'A' è un'istanza di' classe ', in Ruby,' Class' è anche un'istanza, il mio inglese non è buono = ( –

risposta

14

La classe A è un'istanza di Class, e si può vedere che tramite A.class

La classe di un'istanza di A è A, e si accede che tramite a = A.new; a.class

Il metodo ancestors sta mostrando la gerarchia delle classi che un oggetto di quella classe ha (o avrebbe) come eredità.

Ci sono due parallele modelli gerarchia di classe in corso nel tuo esempio, e solo urto sulla vicenda perché Rubino rappresenta sue classi come oggetti per voi di controllare e modificare.

Non c'è alcun motivo fondamentale per cui A.class.ancestors e A.ancestors debbano intersecarsi, tranne Ruby ha anche un modello di classe profonda con radici semplici, quindi in pratica è ciò che vedrete.

In realtà io non sono riuscito a trovare alcuna contro-esempio, anche pari a zero fa questo:

NilClass.ancestors 
=> [NilClass, Object, Kernel, BasicObject] 

NilClass.class.ancestors 
=> [Class, Module, Object, Kernel, BasicObject] 

Questo è più illuminante però:

BasicObject.ancestors 
=> [BasicObject] 

BasicObject.class.ancestors 
=> [Class, Module, Object, Kernel, BasicObject] 
Problemi correlati