Rubyのメタクラスについて勉強していました。私はメタクラスが何であるかがうまく記述されているこの答えを読みました。クラスが作成されると、2つのオブジェクトが作成されます。それは理解できます。1つはクラス自体用で、もう1つはメタクラス用です。しかし、自分で試してみると、3つのオブジェクトが作成されていることがわかります。
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
使用していRuby - 2.5.1ます。
誰かがこれを理解するのを手伝ってくれる?
更新:
参照はSO Iの方法として、ルビー-1.9.1以上を使用して追加した後count_objectsためObjectSpace1.9.1に導入されました。と思われるT_CLASSカウントは常に常に3(と試みられていますruby-1.9.3-p551)。
--disable-jit --disable-gems --disable-did_you_meanとさらに少なくなりますが、カウントは実行全体で常に一貫しており、常に3. macOS "Catalina" 10.15.4でHomebrewのYARV 2.7.1を使用しています。
class Test; endすると、カウントの違いは2です。私が実行したときclass Test; def self.t; end; endの違いをクラスメソッドを作成すると、作成一見ので、3でTestのシングルトンクラスを。ただし、ObjectClass.each_object(Class)配列の違いが前後に実行される[Test]場合は、最初のケースと[Test, #<Class:Test>]2番目のケースです。
2です。IRBで実行した場合の違いは3です。IRBは独自に何かをしているようです。IRBを使用して結果を得ましたか?いずれにせよ、ObjectSpaceIRB(およびおそらくPry)内で実行されるメソッドを実行すると、結果が歪んでしまいます。