Допустим, у меня есть следующий класс:
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!
Ну, я мог бы добавить Proc-финализатор для каждого экземпляра класса Vehicle, который при вызове объекта сборки мусора будет вызываться.Но согласно документации, ObjectSpace.define_finalizer(v,someProc)
вызовет someProc после Экземпляр Vehicle будет уничтожен - это означает, что я не могу использовать self
или self.class
там (так как не будет никакого класса, так как нетобъект!) Я мог бы заставить proc вызывать публичный метод доступа к классу Vehicle, но это устраняет цель доступности переменных класса только для класса и его экземпляров -> по сути, превращая переменные класса в gvars.
Как я могу получить эквивалент метода-деструктора (из C ++), который будет приводить дела экземпляра Vehicle в порядок как бы до сбора мусора?
PS ObjectSpace#count_objects
не является жизнеспособнымвариант, так как даже документы по Ruby заранее.