Если вам нужно контролировать то, что происходит, когда объект уничтожается, вам действительно следует явно уничтожить его самостоятельно - это разработано. Вы также не должны быть способны уничтожить объект явно - это также сделано по замыслу.
Другими словами, с точки зрения вашей программы, объект никогда не будет уничтожен или уничтожен. По этим причинам вам следует переосмыслить проблему (это не редкость - освобождение ресурсов, когда объект больше не нужен), чтобы он соответствовал парадигме 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