2013-09-27 8 views
20

ho una classe definita come di seguitoComprendere rubino .class e .ancestors metodi

class Order 
end 

puts Order.class #-> Class 
puts Order.ancestors #-> [Order, Object, Kernel, BasicObject] 

puts Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject] 

La mia domanda è perché è che Order.ancestors non mostra 'Classe' o 'Module' in catena di antenati? Dato che l'ordine è un oggetto della classe classe, non dovrebbe ordinare mostrare tutti gli antenati della classe?

risposta

47

Per questo è necessario vedere come appare il modello dell'oggetto Ruby.

Ruby object model diagram

Ciò significa che le classi create utilizzando parole chiave class sarà sempre la sottoclasse di Object per impostazione predefinita. Class non è la superclasse della classe Order, ma è un'istanza della classe Class. Module#ancestors includerà l'elenco di moduli inclusi in mod (inclusa la mod stessa) e la superclasse della classe Ordine.

class Order;end 
Order.superclass # => Object 
Order.superclass.superclass # => BasicObject 
Order.superclass.included_modules # => [Kernel] 

Quindi, se si guarda l'output e capire il codice di cui sopra, allora il seguito dovrebbe ormai essere chiaro a voi:

Order.ancestors #-> [Order, Object, Kernel, BasicObject] 

Ora vedere,

class Order;end 
Order.class # => Class 
Order.instance_of? Class # => true 
Order.class.superclass # => Module 
Order.class.superclass.superclass # => Object 
Order.class.superclass.superclass.included_modules # => [Kernel] 

Quindi, se si guarda l'output e capisci il codice sopra, quindi il seguente dovrebbe essere chiaro per te:

Order.class.ancestors #->[Class, Module, Object, Kernel, BasicObject] 

Detto Order.ancestors ti dà gli antenati della classe Order, mentre Order.class.ancestors ti dà gli antenati del Class.

Problemi correlati