我看到了無與倫比的File.open
電話
紅寶石代碼很多時候你能舉個例子嗎?我只能看到,在新手編寫的代碼中,缺少「在大多數編程語言中用於處理文件的流程是開放使用關閉」的常識。
有經驗的Rubyist要麼明確地關閉他們的文件,要麼更習慣地使用File.open
的塊形式,它會自動爲你關閉文件。它的實現基本如下所示:
def File.open(*args, &block)
return open_with_block(*args, &block) if block_given?
open_without_block(*args)
end
def File.open_without_block(*args)
# do whatever ...
end
def File.open_with_block(*args)
yield f = open_without_block(*args)
ensure
f.close
end
腳本是一種特殊情況。腳本通常運行得如此之短,並且使用如此之少的文件描述符,以至於無法關閉它們,因爲操作系統在腳本退出時將會關閉它們。
我們是否需要明確關閉?
是的。
如果是,那麼爲什麼用GC自動關閉?
因爲收集完對象之後,就沒有辦法讓你關閉文件了,因此你會泄漏文件描述符。
請注意,這不是垃圾收集器關閉文件。垃圾收集器只是在收集對象之前執行任何對象的終結器。恰巧File
類定義了一個關閉文件的終結器。
如果沒有,那麼爲什麼選擇?
因爲浪費的內存很便宜,但浪費的文件描述符不是。因此,將文件描述符的生存期與某些內存塊的生命週期相關聯是沒有意義的。
你根本無法預測當垃圾收集器將運行。你甚至不能預測如果它會不惜一切運行:如果你從來沒有用完的內存,垃圾收集器將永遠不會運行,因此終結永遠不會運行,因此該文件將永遠不會被關閉。
你的「常識」已經過時,因爲析構函數被髮明。 – meagar
@meager:破壞者是什麼時候發明的? –
只需注意:雖然文件描述符是有限的,但至少在Linux上,限制相當高。 – Linuxios