2011年8月24日 星期三

Ruby 兩種寫檔方式的不同

前言

因工作關係,所以開始接觸 Ruby,只摸到一點皮毛,還無法對這個語言有太多的見解,這邊記錄兩種寫檔方式的不同影響。

 

第一種寫法

require 'net/http'
 
File.open('yahoo_logo.gif', 'wb') do |f|
    image = Net::HTTP.get('l.yimg.com', '/tw.yimg.com/i/tw/hp/spirit/yahoo_logo.gif')
    f.write(image)
end

 

第二種寫法

require 'net/http'
 
f = File.open('yahoo_logo.gif', 'wb')
image = Net::HTTP.get('l.yimg.com', '/tw.yimg.com/i/tw/hp/spirit/yahoo_logo.gif')
f.write(image)
f.close()
 

 

兩種方法主要差異在

  • 第一種寫法不用撰寫 f.close() ,檔案也會自行關閉;而第二種寫法,是需要多下達 f.close() 的。
  • 第一種寫法在執行的空間不會留下 f 這個變數;第二種寫法在執行的空間會留下 f 這個變數。

 

結論

原則上第一種比較方便,也比較不容易忘記關檔,在 PC 上運作的話,應該不會有需要使用到第二種。

 

插曲

另外發現到一件有趣的事情,採用第二種寫法時,我故意將 f.close() 註解起來,的確會導致檔案被程式 lock 住,這很合理。

接著我故意將變數 f 的內容換掉,讓 File.open 的 token 在我的程式裡消失,看看是否會導致檔案在 runtime 期間永遠被 lock 住,剛改掉 f 的內容時,檔案的確還是被 lock 住的,沒想到過一段時間後,便 unlock 了!我猜測應該是 garbage collection 掃描頻率到了,將沒有被引用的資源回收了起來,這才將檔案 unlock。

沒有留言:

張貼留言