计数 Ruby Class 的初始化

Count initializations of Ruby Class

有没有办法计算只要程序是运行就会创建的实例的数量?

类似

class Foo      
    @bar = 0

    def initialize
        @bar += 1
    end
end

将不起作用(@barinitialize 中是 nil)。

这能以某种方式完成吗?

您应该使用 class 变量而不是实例变量:

class Foo
  @@count = 0
  def initialize
    @@count += 1
  end

  def Foo.get_count
    @@count
  end
end

foo1 = Foo.new
foo2 = Foo.new
foo3 = Foo.new

puts Foo.get_count
# => 3

实例变量属于对象(又名实例),这就是它们毕竟被称为实例变量的原因。您的第一个 @barFoo 的实例变量,您的第二个 @barFoo 的新创建实例的实例变量。这是两个完全不同的对象(它们甚至不属于相同的 class:新创建的实例属于 class Foo,而 Foo 属于 class Class).

您显然需要在 Foo 上调用的方法中递增 @bar,而不是在 Foo 的实例上调用的方法中。那么,我们是否可以考虑一种方法,a) 在 Foo 上调用,b) 每次创建实例时调用? new 呢?

class Foo
  @bar = 0

  def self.new(*)
    @bar += 1
    super
  end
end

好吧,从技术上讲,这不计算实例数,只计算 new 被调用的次数。有时,实例会在不调用 new 的情况下创建,例如反序列化时。这应该是您在不求助于解释器内部的丑陋黑​​客的情况下可以获得的最接近的结果。

您可能认为您可以改写 allocate(我也这么认为),但我刚刚测试了它,但它不起作用。据推测,new 的默认实现不会通过正常方式调用 allocate,而是直接使用解释器内部实现。