2009-09-07 17 views
5

Trong Ruby (1.8.X)Tại sao Object bao gồm cả Kernel và kế thừa nó trong Ruby?

Tại sao đối tượng đều kế thừa hạt nhân và bao gồm? Sẽ không thừa kế là đủ?

 
irb(main):006:0> Object.ancestors 
=> [Object, Kernel] 
irb(main):005:0> Object.included_modules 
=> [Kernel] 
irb(main):011:0> Object.superclass 
=> nil 

Lưu ý trong Ruby 1.9 tình hình cũng tương tự (nhưng một chút bụi):

 
irb(main):001:0> Object.ancestors 
=> [Object, Kernel, BasicObject] 
irb(main):002:0> Object.included_modules 
=> [Kernel] 
irb(main):011:0> Object.superclass 
=> BasicObject 
irb(main):011:0> BasicObject.superclass 
=> nil 
irb(main):011:0> BasicObject.included_modules 
=> [] 

Trả lời

12

Object không kế thừa từ Kernel, nó là lớp cha cuối cùng (trong Ruby 1.8). Kết quả của phương pháp #ancestors bao gồm các mô-đun siêu lớp được bao gồm. Cụ thể, theo thứ tự chúng được tìm kiếm cho bất kỳ cuộc gọi cụ thể nào.

+2

dòng dưới cùng, tổ tiên và siêu lớp không bị nhầm lẫn –

5

Khi bạn đưa mô-đun vào một lớp, nó sẽ trở thành một phần của cấu trúc phân cấp kế thừa của nó. Vì vậy, bằng cách bao gồm Object.ancestors Kernel sẽ bao gồm (không có ý định chơi chữ) Hạt nhân. Trong các phiên bản ruby ​​< 1.9 Đối tượng nằm ở trên cùng của hệ thống phân cấp, vì vậy nó không có siêu lớp

Các vấn đề liên quan