2009-08-02 28 views

Trả lời

10

lớp trả về lớp (#type) không phải là tổ tiên. Lớp của đối tượng là Class. Lớp của lớp là Lớp. Lớp là một đối tượng. Sự thật trong quảng cáo: Tôi chưa bao giờ học Ruby, nhưng mối quan hệ Object-Class là Smalltalk được đặt ra 30 năm trước.

+4

metaclasses làm việc khác nhau trong Ruby: họ nhận được tiêm vào chuỗi phương pháp tra cứu, do đó Ruby không có hai hệ thống phân cấp song song của các lớp và metaclasses, nhưng, như bạn nói, những điều cơ bản là giống hệt nhau. –

+0

@Jorg: cảm ơn. Ngay sau khi tôi hoàn thành dự án hiện tại của tôi, tôi sẽ nhận được trên đường ray và ruby, tôi đã nghe rất nhiều lời khen ngợi rằng tôi đang hấp dẫn :) –

+0

Cảm ơn bạn. Tôi nghĩ rằng tôi rõ ràng về mối quan hệ bây giờ. Thông tin của @ Jörg_W_Mittag cũng giúp ích. Đó là, các lớp và Metaclasses là hai khái niệm khác nhau nhưng liên quan. – fwoncn

5

Đây là cách nó hoạt động trong ruby ​​1.9:

lớp
Class.class = Class 

Class.superclass = Module 
Module.class = class 
Module.superclass = Object 
Object.class = Class 
Object.superclass = BasicObject 
BasicObject.class = Class 
BasicObject.superclass = nil 
6

Object 's là Class (kể từ Object chính nó là một lớp), và Object là tổ tiên của Class.

Có tham chiếu vòng tròn, nó khá phức tạp. Đề nghị cá nhân của tôi, nếu bạn không thực sự cần phải chơi với nó, đừng đi đến đó.

9

Class, Object, Module và mọi tầng lớp khác trường của một lớp Lớp :)

Class.class == Module.class == Object.class == Hash.class == Lớp

class là cũng là một đối tượng (giống như bất kỳ đối tượng khác trong hệ thống) nhưng nó không phải là trực tiếp thể hiện của đối tượng, nó là một thể hiện của một bắt nguồn lớp (class trong trường hợp này)

Class.superclass.superclass == Object (với Module ở giữa)

Đối tượng chính nó cũng là một lớp. vì vậy Object.class == Lớp

Lớp, Mô-đun và đối tượng có phụ thuộc vòng tròn vì chúng nằm trong lõi của mô hình OO.

Object.class.superclass.superclass == Object

=> parent (.superclass) 
-> instance-of (.class) 

alt text http://www.grabup.com/uploads/b10b2ffa9976953e3d6f88e6fcbf6f28.png?direct

+0

Phụ thuộc vòng tròn hoạt động vì đây là tất cả các lớp được tích hợp sẵn. Chúng là một phần của thời gian chạy Ruby cốt lõi và được thiết lập theo cách này lúc khởi động và không được thêm vào theo cách bạn thường thêm một lớp. Thời gian chạy có sức mạnh để thiết lập các con trỏ tuy nhiên nó muốn, và các nhà thiết kế đã chọn để làm điều đó theo cách này. –

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