2013-09-27 230 views
20

Tôi đã một lớp được định nghĩa như sauHiểu ruby ​​.class và .ancestors phương pháp

class Order 
end 

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

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

Câu hỏi của tôi là tại sao nó rằng Order.ancestors không hiển thị 'Class' hoặc 'Mô-đun' trong chuỗi tổ tiên? Vì Order là một đối tượng của Class class, nên Order không hiển thị tất cả các tổ tiên của Class?

Trả lời

47

Để biết rằng bạn cần xem mô hình đối tượng Ruby trông như thế nào.

Ruby object model diagram

Điều đó có nghĩa các lớp học tạo ra sử dụng từ khóa class sẽ luôn luôn là lớp con của Object theo mặc định. Class không phải là siêu lớp của lớp học Order, thay vào đó là một phiên bản của lớp Class. Module#ancestors sẽ bao gồm danh sách các mô-đun được bao gồm trong mod (bao gồm cả bản thân mod) và siêu lớp của lớp học của bạn Đặt hàng.

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

Vì vậy, nếu bạn nhìn vào đầu ra và hiểu được đoạn mã trên, thì dưới đây sẽ hiện rõ ràng cho bạn:

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

Bây giờ nhìn thấy,

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] 

Vì vậy, nếu bạn hãy xem kết quả đầu ra và hiểu mã ở trên, khi đó bên dưới phải rõ ràng với bạn:

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

Điều đó nói rằng Order.ancestors ban cho ngươi tổ tiên của lớp Order, trong khi Order.class.ancestors ban cho ngươi tổ tiên của Class.