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?
Trả lời
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>
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
Bằng phương pháp singleton bạn có nghĩa là phương pháp lớp học? – rdvdijk
Vâng, tôi có nghĩa là phương pháp lớp học. – eugeniodepalo
- 1. Tôi có thể truy cập phương thức lớp và phương thức thể hiện bằng ruby như thế nào?
- 2. Tại sao phương thức getResourceAsStream nằm trong lớp Class?
- 3. Attributes.Add ("class", "className") nhưng bảo tồn lớp hiện có
- 4. trường hợp của lớp Class
- 5. Mục tiêu-c: Làm thế nào tôi có thể lấy dụ lớp trong phương thức lớp
- 6. Thuộc tính '.class' hoạt động như thế nào?
- 7. AttributeError: Class Instance không có phương thức __call__
- 8. Làm thế nào tôi có thể chuyển thuộc tính của một lớp như một tham số của một phương thức?
- 9. Tôi có thể sử dụng thuộc tính lớp làm giá trị mặc định cho một phương thức thể hiện không?
- 10. Phương thức Ruby Unbound: Có thể buộc ràng buộc với các thể hiện của các lớp khác không?
- 11. Các tên lớp và phương thức mát được bọc trong ``: class `Đây là một lớp học tuyệt vời` {}?
- 12. JavaScript Prototype Chaining super class constructor và phương thức gọi
- 13. Làm thế nào để thực hiện + Lớp (Class) lớp trong Xamarin.iOS?
- 14. Làm thế nào tôi có thể xác định lại các phương thức lớp Perl?
- 15. Để xem phương thức trong tệp .class được nhúng trong tệp jar | là nó có thể?
- 16. Tôi có thể thêm các phương thức lớp và các phương thức mẫu từ cùng một mô-đun không?
- 17. Làm thế nào tôi có thể gọi một phương thức tĩnh trên một lớp biến?
- 18. Làm thế nào tôi có thể buộc các lớp kế thừa để thực hiện một phương thức tĩnh trong C#?
- 19. Tạo một phương thức đồng thời là một thể hiện và phương thức lớp
- 20. Có cách nào để gọi một phương thức Class riêng tư từ một cá thể trong Ruby không?
- 21. Proxy không thể được đúc để CLASS
- 22. Lấy thuộc tính .class của một lớp generic
- 23. Có thể gọi các phương thức của lớp con trên đối tượng siêu lớp không?
- 24. Làm thế nào để tạo một trình trang trí lớp Python có thể bọc các cá thể, lớp và các phương thức tĩnh?
- 25. Khai báo giao thức như @class
- 26. Tạo thể hiện lớp từ bên trong phương thức tĩnh
- 27. Tôi có thể có RSpec không có lớp học cho các phương thức
- 28. Các loại phương thức phụ thuộc và loại-lớp
- 29. Calling overriden phương pháp trong lớp có nguồn gốc từ Base Class
- 30. Ủy quyền các phương thức thể hiện cho phương thức lớp
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. –