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
ためObjectSpace
1.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を使用して結果を得ましたか?いずれにせよ、ObjectSpace
IRB(およびおそらくPry)内で実行されるメソッドを実行すると、結果が歪んでしまいます。