2010-10-28 32 views
4

讓我們說我有一個記錄器類,它具有指向打開文件的屬性。這個文件應該是開放的,直到這個類不再使用。例如:在ruby中釋放對象的最佳做法

class MyLogger 
    attr_accessor :log_file 
    def initialize 
    @log_file = File.new('my_log_file_name.log','w') 
    end 

    def finalize(id) 
    @log_file.close 
    end 
end 

如何確保當我不再使用此實例時,文件句柄將被關閉?從來就試過,但沒有效果:

l = MyLogger.new 
l = nil 
ObjectSpace.garbage_collect 

在此之後,如果我嘗試刪除該文件就會拋出一個錯誤,說明該文件正在使用中。

回答

3

只需通過方法調用關閉文件句柄即可。以其他方式執行它並沒有什麼意義,尤其是等待垃圾收集器。如果你知道你已經完成了它,那麼在那個時候進行清理。

+4

你可以有一個像'File.open'這樣的方法,它接受一個塊併爲你打開和關閉文件句柄。 – Chuck 2010-10-28 19:13:14

0

如果您需要從對象中釋放資源,請明確執行此操作。

我發現this sample source code有幫助。

0

由於Ruby垃圾收集器在不可預知的時間運行,所以不可能知道析構函數代碼何時運行。如果您在單次方法調用中每次打開和關閉文件可能會更好。

0

您是否需要一直打開日誌文件?當您想記錄某些內容並將該邏輯隱藏在MyLogger方法中時,您可以執行打開/寫入/關閉操作。打開和關閉一個文件總是有一些開銷,但是這個開銷可能是無關緊要的,除非你在一個循環中記錄每個迭代。

如果外面的世界直接訪問log_file,那麼你手上的問題比手動關閉更大。如果已經有一個很大的代碼庫直接與log_file混淆,那麼你可以用一個小對象代替它,這個對象在寫入時會執行必要的打開/寫入/關閉序列。