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_objects
cho ObjectSpace
đã được giới thiệu trong 1.9.1. Có vẻ như T_CLASS
số đế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; end
sự khác biệt về số lượng là 2; Khi tôi chạy class Test; def self.t; end; end
sự 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 Test
lớ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ácObjectSpace
phương thức thực thi chạy trong IRB (và Pry, có lẽ) cho kết quả bị bóp méo.