Ответ 1
Если вам нужно контролировать, что происходит, когда объект уничтожается, вы действительно должны явно его уничтожать - это по дизайну. Вы не должны также явно уничтожать объект - это тоже по дизайну.
Другими словами, с точки зрения вашей программы объект никогда не уничтожается и не уничтожается. По этим причинам вы должны переосмыслить проблему (это не редкость - освобождение ресурсов, когда объект больше не нужен), поэтому он вписывается в парадигму Ruby.
Установка объекта в nil дает подсказку сборщику мусора, но не обязательно немедленно уничтожает его.
Однако, если вы должны обработать сборщик мусора, тогда прочитайте.
Нет прямой поддержки деструктора, но вы можете вызвать функцию функцию финализатора, когда она будет уничтожена.
Согласно http://pleac.sourceforge.net/pleac_ruby/classesetc.html, это может быть не сбор мусора, если он содержит ссылку на исходный объект, поэтому должен быть метод класса и а не метод экземпляра.
class MyClass
def initialize
ObjectSpace.define_finalizer(self,
self.class.method(:finalize).to_proc)
end
def MyClass.finalize(id)
puts "Object #{id} dying at #{Time.new}"
end
end