Eu estava estudando sobre a metaclasse de Ruby. I ler esta resposta onde é bem descreveu o que metaclass é. É mostrado lá quando uma classe é criada, ela cria dois objetos. O que é compreensível. Um para a classe em si e outro para sua metaclasse. Mas quando estou tentando, vejo que está criando três objetos.
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
Eu estou usando Ruby - 2.5.1.
Alguém pode me ajudar a entender esse?
Atualizar:
A referência de forma a deixar que é adicionado usando rubi-1.9.1 ou superior, tal como o método count_objectspara ObjectSpacefoi introduzido em 1.9.1. Parece que a T_CLASScontagem sempre foi sempre 3 (tentada com ruby-1.9.3-p551).
Então, até agora ainda é um mistério o porquê dessa resposta . Ruby sob um microscópio também diz que a contagem é 2.
--disable-jit --disable-gems --disable-did_you_mean, obtenho menos ainda, mas a contagem é sempre consistente entre as execuções e sempre difere por 3. Estou usando o YARV 2.7.1 da Homebrew no macOS "Catalina" 10.15.4.
class Test; enda diferença na contagem é 2; quando executo class Test; def self.t; end; enda diferença é 3, aparentemente porque a criação do método class cria Testa classe singleton da. No entanto, se eu executar ObjectClass.each_object(Class)antes e depois da diferença nas matrizes, é [Test]no primeiro caso e [Test, #<Class:Test>]no segundo.
2. Quando executado com IRB, a diferença é3. O IRB parece estar fazendo algo por conta própria. Você obteve seu resultado usando o IRB? De qualquer forma, osObjectSpacemétodos de execução executados no IRB (e Pry, talvez) fornecem resultados distorcidos.