2011-09-25 30 views
6

Tôi đang nghiên cứu cách trình thông dịch Ruby được triển khai, và một câu hỏi đã xảy ra mà vẫn chưa nhận được câu trả lời nào cho tôi. Đó là một trong tiêu đề: kể từ Class (r_cClass) có super được đặt thành chính nó (bỏ qua metaclasses, vì thực tế super là metaclass của r_cClass), nếu tôi gửi một phương thức đến đối tượng Class, điều này sẽ được xem trong bảng phương thức Class 'lớp học. Nhưng lớp học Class 'là Class, vì vậy tôi không nên tìm kiếm các phương pháp thể hiện của Class? Nhưng đó không phải là trường hợp kể từ trong các tài liệu hướng dẫn Class lớp và Class phương pháp thể hiện được tách ra. Trong số search_method trong số eval.c của Ruby, tôi không tìm thấy bất kỳ séc đặc biệt nào cho lớp học Class. Bất cứ ai có thể làm sáng tỏ về điều này?Lớp có thể thuộc lớp Class và không có các phương thức thể hiện Class như thế nào?

+0

Trong câu hỏi trừu tượng như vậy, có thể là một ý tưởng hay để đưa ra các ví dụ cụ thể, ví dụ như một ví dụ về phương pháp thể hiện và ví dụ về một phương pháp lớp học. –

Trả lời

3

Niềm tin của bạn về cách thức hoạt động của nó có vẻ đúng, nhưng tôi không chắc tại sao bạn nghĩ nó không hoạt động theo cách đó.

Trong Ruby 1.8.7:

irb> a = Class.new.methods - Object.new.methods 
=> [... 36 element array ...] 
irb> b = Class.methods - Object.new.methods 
=> [... 37 element array ...] 
irb> b - a 
=> ["nesting"] 

Một lớp dụ bình thường (Class.new) có 36 phương pháp dụ. Nếu tôi nhìn vào Class, nó cũng là một cá thể lớp bình thường, nó có cùng 36 phương thức cá thể, cộng với 1 phương thức lớp bổ sung (lồng nhau), chỉ tồn tại vì nó được thừa hưởng từ mô-đun siêu lớp của nó.

Lưu ý rằng việc thêm một phương thức thể hiện vào Lớp tự động cũng thêm phương thức đó làm phương thức lớp, nhưng việc thêm lớp vào metaclass của Lớp sẽ không.

irb> class Class ; def everywhere ; true ; end ; end 
irb> class << Class ; def only_singleton ; true ; end ; end 
irb> Class.everywhere 
=> true 
irb> Class.new.everywhere 
=> true 
irb> Class.only_singleton 
=> true 
irb> Class.new.only_singleton 
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8> 
+0

Vì vậy, các phương pháp trên thực tế là giống nhau. Trên thực tế không có đầu mối trong mã nguồn đã dẫn tôi đến suy nghĩ này. Nó chỉ là các tài liệu Ruby rõ ràng tách lớp thể hiện phương thức từ các phương thức lớp đơn. Sự tách biệt đó chỉ được thực hiện cho sự rõ ràng? – eugeniodepalo

+0

Bằng phương pháp singleton bạn có nghĩa là phương pháp lớp học? – rdvdijk

+0

Vâng, tôi có nghĩa là phương pháp lớp học. – eugeniodepalo

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