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_objects
para ObjectSpace
foi introduzido em 1.9.1. Parece que a T_CLASS
contagem 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; end
a diferença na contagem é 2; quando executo class Test; def self.t; end; end
a diferença é 3, aparentemente porque a criação do método class cria Test
a 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, osObjectSpace
métodos de execução executados no IRB (e Pry, talvez) fornecem resultados distorcidos.