2009-09-27 30 views
0

我有一個方法返回一個File對象。我需要知道文件何時關閉。這不像覆蓋close方法那麼簡單。如果文件被析構函數關閉,則不會調用close方法。當文件關閉時,ruby如何提供回調?

它應該是這樣的:

def something 
    get_lock_on_file 
    file File.new("foobar") 
    file.on_close { release_lock_on_file } 
    file 
end 

如何實現文件#on_close(&塊)?

+0

Ruby是否允許覆蓋析構函數? – luiscubal

+0

你能分享一些代碼嗎? – khelll

+1

@luiscubal:Ruby沒有析構函數。 –

回答

2

恐怕沒有什麼可以做的。如果File#close方法沒有被調用,那麼當Ruby解釋器退出時,文件實際上只會被操作系統自動關閉。換句話說:在文件關閉的時候,Ruby解釋器(或者至少是你的程序)早已不復存在,所以你的程序無法得到通知。

我想你可以通過

  • 實現一些有點道理覆蓋重寫File對象的方法,
  • 安裝自己的終結和
  • 安裝一個at_exit處理程序。

但是,所有這些都有他們的問題:方法可能不會被調用。終結器只在對象被垃圾回收時運行,這可能比你期望的要晚得多(如果你永遠不會用完內存,那麼垃圾回收器永遠不會運行,終結器也不會被調用)。如果解釋器崩潰,即使是at_exit處理程序也不能保證運行。

3

定義東西這樣的...

def something 
    get_lock_on_file 
    yield file 
    release_lock_on_file 
end 

..並使用它像:

something do |file| 
    ... 
end 

與錯誤處理區塊裹產量,如果你需要它。

+0

我的方法必須返回文件。 – johannes

+0

在def結束之前添加:file – khelll

相關問題