2013-09-27 12 views
20

Ich habe eine Klasse definiert, wie untenVerständnis Rubin .class- und .ancestors Methoden

class Order 
end 

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

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

Meine Frage ist, warum ist es, dass Order.ancestors nicht zeigen ‚Klasse‘ oder ‚Module‘ in Vorfahren Kette? Da Orden ein Objekt der Klassenklasse ist, sollte Orden nicht alle Vorfahren der Klasse anzeigen?

Antwort

47

Dafür müssen Sie sehen, wie das Ruby-Objektmodell aussieht.

Ruby object model diagram

Das heißt, die class mit Keyword erstellt Klassen werden immer die Unterklasse von Object standardmäßig sein. Class ist nicht die Oberklasse Ihrer Klasse Order, sondern eine Instanz der Klasse Class. Module#ancestors enthält Liste der Module in mod (einschließlich mod selbst) und die Oberklasse Ihrer Klasse Order.

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

Wenn Sie also am Ausgang sehen und verstehen, den obigen Code, dann sollte die unten nun klar sein, Sie:

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

Jetzt sehen,

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] 

Also, wenn Sie schau dir den Ausgang an und versteh den obigen Code, dann sollte dir nun folgendes klar sein:

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

Das heißt Order.ancestors Sie die Vorfahren der Klasse Order, während Order.class.ancestors gibt Ihnen die Vorfahren der Class gibt.