Tôi đang nghiên cứu về siêu dữ liệu của Ruby. Tôi đọc câu trả lời này trong đó nó được mô tả độc đáo metaclass là gì. Nó được hiển thị ở đó khi một lớp được tạo, nó sẽ tạo hai đối tượng. Đó là điều dễ hiểu. Một cho chính lớp và một cho siêu dữ liệu. Nhưng khi tôi đang thử nó, tôi thấy rằng nó đang tạo ra ba đối tượng.
puts "Before Class Creation object count - #{ObjectSpace.count_objects[:T_CLASS]}"
class Test
def self.foo # test_singleton
p 'Printed from method #foo'
end
def bar # test
p 'Printed from method #bar'
end
end
puts "After Class Creation object count - #{ObjectSpace.count_objects[:T_CLASS]}"
###############
Before Class Creation object count - 949
After Class Creation object count - 952
Tôi đang sử dụng Ruby - 2.5.1.
Bất cứ ai có thể giúp tôi hiểu điều này?
Cập nhật:
Các tài liệu tham khảo SO đăng bài mà tôi đã thêm được sử dụng ruby-1.9.1 hoặc cao hơn, như là phương pháp count_objectscho ObjectSpaceđã được giới thiệu trong 1.9.1. Có vẻ như T_CLASSsố đếm luôn luôn là 3 (đã thử với ruby-1.9.3-p551).
Vì vậy, cho đến bây giờ nó vẫn là một bí ẩn tại sao câu trả lời này . Ruby dưới kính hiển vi cũng cho biết số lượng là 2.
--disable-jit --disable-gems --disable-did_you_mean, tôi thậm chí còn ít hơn, nhưng số lượng luôn luôn nhất quán trong các lần chạy và luôn khác nhau bởi 3. Tôi đang sử dụng YARV 2.7.1 từ Homebrew trên macOS "Catalina" 10.15.4.
class Test; endsự khác biệt về số lượng là 2; Khi tôi chạy class Test; def self.t; end; endsự khác biệt là 3, dường như bởi vì việc tạo phương thức lớp sẽ tạo ra Testlớp đơn lẻ. Tuy nhiên, nếu tôi chạy ObjectClass.each_object(Class)trước và sau sự khác biệt trong các mảng là [Test]trong trường hợp đầu tiên và [Test, #<Class:Test>]trong lần thứ hai.
2. Khi chạy với IRB, sự khác biệt là3. IRB dường như đang tự làm một cái gì đó. Bạn đã nhận được kết quả của bạn bằng IRB? Trong mọi trường hợp, cácObjectSpacephương thức thực thi chạy trong IRB (và Pry, có lẽ) cho kết quả bị bóp méo.