16

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

如果我需要手动处理这个问题,我可以显式销毁该对象吗?还是我能做的最好的是object = nil

4

1 回答 1

21

如果你需要控制一个对象被销毁时会发生什么,你真的应该自己明确地销毁它——这是设计使然。您也不应该明确地销毁对象-这也是设计使然。

换句话说,从您的程序的角度来看,一个对象永远不会被销毁或可销毁。由于这些原因,您应该重新考虑问题(这并不罕见 - 当不再需要对象时释放资源),以便它适合 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
于 2008-10-01T04:45:23.043 回答