Tôi bị kẹt. Tôi đang cố gắng để xác định động một phương pháp lớp và tôi không thể quấn đầu của tôi xung quanh mô hình metaclass ruby. Xem xét các lớp sau:Ruby metaclass madness
class Example
def self.meta; (class << self; self; end); end
def self.class_instance; self; end
end
Example.class_instance.class # => Class
Example.meta.class # => Class
Example.class_instance == Example # => true
Example.class_instance == Example.meta # => false
Rõ ràng cả hai phương thức đều trả về một thể hiện của Lớp. Nhưng hai trường hợp này không giống nhau. Họ cũng có tổ tiên khác nhau:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
Điểm khác biệt trong việc tạo sự khác biệt giữa metaclass và cá thể lớp học là gì?
Tôi đã tìm ra, rằng tôi có thể send :define_method
với metaclass để xác định động một phương pháp, nhưng nếu tôi cố gắng gửi nó đến cá thể lớp, nó sẽ không hoạt động. Ít nhất tôi có thể giải quyết vấn đề của mình, nhưng tôi vẫn muốn hiểu tại sao nó lại hoạt động theo cách này.
Update Mar 15, 2010 13:40
Are các giả định sau đúng.
- Nếu tôi có phương pháp thể hiện gọi self.instance_eval và xác định phương thức, nó sẽ chỉ ảnh hưởng đến trường hợp cụ thể của lớp đó.
- Nếu tôi có một phương thức cá thể gọi self.class.instance_eval (sẽ giống như gọi class_eval) và định nghĩa một phương thức, nó sẽ ảnh hưởng đến tất cả các cá thể của lớp cụ thể đó dẫn đến một phương thức mới.
- Nếu tôi có một phương thức lớp gọi instance_eval và định nghĩa một phương thức, nó sẽ dẫn đến một phương thức thể hiện mới cho tất cả các cá thể.
- Nếu tôi có một phương thức lớp gọi instance_eval trên lớp meta/eigen và định nghĩa một phương thức, nó sẽ dẫn đến một phương thức lớp.
Tôi nghĩ điều đó bắt đầu có ý nghĩa với tôi. Nó chắc chắn sẽ giới hạn khả năng của bạn nếu tự bên trong một phương thức lớp sẽ trỏ đến lớp riêng. Nếu không, nó sẽ không thể xác định một phương thức thể hiện từ bên trong một phương thức lớp. Đúng không?
Để biết thêm thông tin về _why_ một 'def' bên trong một' instance_eval' định nghĩa các phương thức lớp, hãy xem bài viết này http://yugui.jp/articles/846 – horseyguy
Cảm ơn rất nhiều cho đến nay. Tôi cập nhật câu hỏi của mình. Bạn có phiền khi xem nó không? – t6d
Được cập nhật để trả lời câu hỏi trong bản cập nhật của bạn. – khelll