计数 Ruby Class 的初始化
Count initializations of Ruby Class
有没有办法计算只要程序是运行就会创建的实例的数量?
类似
class Foo
@bar = 0
def initialize
@bar += 1
end
end
将不起作用(@bar
在 initialize
中是 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
实例变量属于对象(又名实例),这就是它们毕竟被称为实例变量的原因。您的第一个 @bar
是 Foo
的实例变量,您的第二个 @bar
是 Foo
的新创建实例的实例变量。这是两个完全不同的对象(它们甚至不属于相同的 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
,而是直接使用解释器内部实现。
有没有办法计算只要程序是运行就会创建的实例的数量?
类似
class Foo
@bar = 0
def initialize
@bar += 1
end
end
将不起作用(@bar
在 initialize
中是 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
实例变量属于对象(又名实例),这就是它们毕竟被称为实例变量的原因。您的第一个 @bar
是 Foo
的实例变量,您的第二个 @bar
是 Foo
的新创建实例的实例变量。这是两个完全不同的对象(它们甚至不属于相同的 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
,而是直接使用解释器内部实现。