Có cách nào kiểm tra xem một đối tượng có một lớp đơn mà không tạo một lớp không?Làm thế nào để kiểm tra xem một đối tượng có một lớp đơn (eigenclass) mà không cần tạo một lớp
Khác với được nêu trong Check if an object has a singleton class, không đúng là mọi đối tượng đều có một lớp đơn (xem bằng chứng dưới https://repl.it/DuVJ/2).
Các phương pháp sau đây xuất hiện trong đầu của tôi, nhưng không có tác dụng:
obj.singleton_class
này sẽ tự động tạo ra một lớp singleton mới nếu không tồn tại (xem https://ruby-doc.org/core-1.9.2/Object.html#method-i-singleton_class).
Sử dụng
ObjectSpace
:has_singleton_class = ObjectSpace.each_object(Class).any? do |klass| klass < self.class && klass.singleton_class? && self.is_a?(klass) end
này rất chậm và có thể không làm việc dưới JRuby như
ObjectSpace
có thể không có sẵn.obj.singleton_methods
chỉ hoạt động nếu lớp singleton có ít nhất một phương pháp.
vấn đề gì bạn đang cố gắng để giải quyết? Như Jörg đã viết trong câu trả lời liên kết, "Bất cứ khi nào bạn đi tìm một lớp singleton, nó sẽ ở đó." Trường hợp sử dụng của bạn là gì? –
Chúng tôi đang làm việc trên https: // github.com/đường ray/đường ray/kéo/26771. Vấn đề là khi chúng ta thêm các lớp không mong muốn thông qua 'singleton_class', nó phá vỡ một số bài kiểm tra Rails kiểm tra số lớp. Chúng ta muốn đi qua 'self.singleton_class' nếu nó tồn tại, và nếu không gọi phương thức này là' self.class'. – Remo
Ý kiến của tôi là: 'ObjectSpace' cho phép bạn nhìn phía sau bức màn. Nhưng nếu bạn làm điều đó, bạn có thể thấy những thứ mà bạn không được thấy. Tôi đứng bởi sự khẳng định của tôi về câu hỏi được liên kết: các lớp singleton luôn tồn tại. Người thông dịch có thể chỉ có thể * thể chất * tạo ra chúng khi chúng cần thiết, nhưng mỗi khi bạn nhìn vào * kiểm tra * liệu có một, có * sẽ * là một hay không. Ví dụ, YARV luôn tạo các lớp đơn cho các mô đun và lớp, bất kể chúng có cần hay không, và nó không bao giờ tạo chúng cho các đối tượng khác, trừ khi bạn thực sự mở nó hoặc thêm một phương thức singleton. –