2008-10-01 106 views
16

我寫了一個自定義Rails模型。該模型由實際的服務器而不是數據庫表支持(因此它不會從ActiveRecord::Base繼承)。爲了從服務器獲取請求的信息,我打開一個SSH連接。因爲rails不會重用對象,所以會爲接收到的任何請求創建一個新對象,以及到服務器的新SSH連接。爲了減少服務器壓力,我希望在模型對象被垃圾收集之前關閉SSH連接。我想知道ruby是否提供通知機制來通知對象它將被銷燬?如果是這樣,我可以使用此通知來了解何時關閉SSH連接。如果沒有,當我知道我已完成對象時,我需要手動完成它。Ruby中對象銷燬的通知

如果我需要手動處理此問題,我可以明確銷燬該對象嗎?或者是我能做的最好的是object = nil

回答

21

如果你需要控制一個對象被銷燬時會發生什麼,你應該自己明確地銷燬它 - 這是設計。你不應該明確地摧毀一個對象 - 這也是通過設計。

換句話說,從程序的角度來看,一個對象永遠不會被破壞或銷燬。由於這些原因,您應該重新考慮這個問題(這不是一個不常見的需求 - 當不再需要對象時釋放資源),因此它符合Ruby範例。

將對象設置爲零會給垃圾收集器一個提示,但不一定會立即銷燬它。

但是,如果您必須讓垃圾收集器處理它,然後繼續閱讀。

對於析構函數沒有直接的支持,但是當它被銷燬時可以調用finalizer function

根據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 
0

我張貼在另一個線程的StackOverflow這在某種程度上這是類似於Python的上下文管理器實現了紅寶石的解決方案here。從客戶端來看,銷燬是隱含的。