Estaba estudiando sobre la metaclase de Ruby. Yo leí esta respuesta en la que se describe muy bien lo que es metaclase. Se muestra allí cuando se crea una clase, creará dos objetos. Lo cual es comprensible. Uno para la clase en sí y otro para su metaclase. Pero cuando lo intento, veo que está creando tres 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
Estoy usando Ruby - 2.5.1
.
¿Alguien puede ayudarme a entender esto?
Actualizar:
La referencia SO Post que añadí está utilizando ruby-1.9.1 o mayor, como el método count_objects
para ObjectSpace
se introdujo en 1.9.1. Parece que el T_CLASS
conteo siempre ha sido 3 (probado con ruby-1.9.3-p551
).
Entonces, hasta ahora sigue siendo un misterio por qué esta respuesta . Ruby bajo un microscopio también dice que el recuento es 2.
--disable-jit --disable-gems --disable-did_you_mean
, obtengo aún menos, pero el conteo siempre es consistente en las ejecuciones y siempre difiere según 3. Estoy usando YARV 2.7.1 de Homebrew en macOS "Catalina" 10.15.4.
class Test; end
la diferencia en conteo es 2; cuando ejecuto class Test; def self.t; end; end
la diferencia es 3, aparentemente porque crear el método de clase crea Test
la clase singleton. Sin embargo, si ejecuto ObjectClass.each_object(Class)
antes y después, la diferencia en las matrices es [Test]
en el primer caso y [Test, #<Class:Test>]
en el segundo.
2
. Cuando se ejecuta con IRB la diferencia es3
. IRB parece estar haciendo algo por su cuenta. ¿Obtuviste tu resultado usando IRB? En cualquier caso, losObjectSpace
métodos de ejecución ejecutados dentro de IRB (y Pry, tal vez) dan resultados distorsionados.