Ruby中对象销毁的通知

时间:2020-03-06 14:57:39  来源:igfitidea点击:

我已经编写了一个定制的Rails模型。该模型由实际的服务器而不是数据库表支持(因此它不继承自ActiveRecord :: Base)。为了从服务器获取请求的信息,我打开了到该服务器的SSH连接。因为rails不会重用对象,所以将为接收到的请求创建一个新对象以及与服务器的新SSH连接。为了减轻服务器压力,我想在收集模型对象之前关闭SSH连接。我想知道Ruby是否提供了一种通知机制来通知对象它将被销毁?如果是这样,我可以使用此通知来了解何时关闭SSH连接。如果不是这样,当我知道对象已完成时,我将需要手动进行。

如果需要手动进行此操作,是否可以明确销毁该对象?还是我能做的最好的事就是'object = nil'?

解决方案

如果我们需要控制销毁对象时发生的情况,那么实际上我们应该明确地销毁它,这是设计使然。我们也不应该能够明确地销毁对象,这也是设计使然。

换句话说,从程序的角度来看,一个对象永远不会被破坏或者破坏。由于这些原因,我们应该重新考虑这个问题(当不再需要该对象时,这并不是常见的资源释放需求),因此它适合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