【发布时间】:2012-02-23 02:43:51
【问题描述】:
假设我有以下课程:
class Vehicle
@@total_vehicles = 0
@@all_instances = Array.new
def initialize
@@total_vehicles += 1
@@all_instances << self
end
def total_vehicles #returns total number of Vehicles 'alive'
return @@total_vehicles
end
def all_vehicles #returns an array of all Vehicle objects
return @@all_instances
end
end
现在,为了使 @@total_vehicles 和 @@all_instances 保持最新和正确,我想确保当其中一个对象被垃圾回收时,它们分别正确递减和更新。但这就是发生的事情:
v = Vehicle.new
Vehicle.total_vehicles # => 1
v = nil #no references to Vehicle instance now
ObjectSpace.garbage_collect #instance garbage collected
Vehicle.total_vehicles # => 1 Nope!
好吧,我可以为 Vehicle 类的每个实例添加一个终结器 Proc,当调用对象的垃圾收集时,它会被调用。但根据文档,ObjectSpace.define_finalizer(v,someProc) 会调用 someProc Vehicle 实例被销毁 - 这意味着我不能在那里使用self 或self.class(因为没有类,因为有没有对象!)我可以让 proc 调用 Vehicle 类上的公共访问器方法,但这消除了类变量只能由类及其实例访问的目的 -> 本质上是将类变量转换为 gvar。
我怎样才能拥有相当于一个析构函数方法(来自 C++),它可以在垃圾收集之前按顺序获取 Vehicle 实例的事务?
附:
ObjectSpace#count_objects 不是一个可行的选择,因为即使是 Ruby 文档也是如此。
【问题讨论】:
-
我不久前读到的关于这个主题的有趣博客文章:blog.maxaller.name/2009/12/destructors-in-ruby-not-quite
-
您的代码不返回“1”,而是返回 NoMethodError(方法为实例方法)。
标签: ruby garbage-collection finalizer