2011-07-26 33 views
6

Ben yakut için oldukça yeni ve şu anda her şeyi tanımak için Pickaxe kitap okuyorum. File.open bölümünde, File.open çağrısına bir parametre olarak bir bloğun alınmasının ardından dosyanın kapatıldığını garanti ettiğiyle karşılaştım. Şimdi bu, kendini ayağından vurmaktan kaçınmak için kesinlikle harika bir yol gibi geliyor, ve ben de ayak parmaklarımın üzerinde tehlikeli olduğum için, ben ona bir adım atacağım. İşte (bu konularda irb) yazdıklarımı geçerli:File.open ve blokları, Ruby 1.8.7

File.open('somefile.txt', 'r').each { |line| puts line }`` 

Beklentim dosyası somefile.txt, okumak, açılan basılı ve sağ kapalı alacağı oldu? Yanlış anlayabildiğim kadarıyla. Açık dosya tanıtıcılarına bakmak için lsof kullanırsam, hala açıktır. Ancak, ben bu örnekte yanlış blokları kullanıyor muyum

f = File.open('somefile.txt', 'r').each { |line| puts line } 
f.close() 

yapmak ya ben bir blok ile kullanıldığında File.Open anlamını anlamak için başarısız var. ruby-doc.org related to File.open'da bölüm okudum ama yaptığım şeyin beklendiği gibi çalıştığını doğrulamak gibi görünüyor.

Neyi yanlış yaptığımı açıklayan var mı? bloktan sonra dosyayı kapatmak için

cevap

8

, sen each değil, doğrudan File.open() için blok geçmelidir:

File.open('somefile.txt', 'r') do |f| 
    f.each_line { |l| puts l } 
end 

File.open(…).each {…}

sadece kapatmadan açılan dosya üzerinde yineleme edilir.

+0

File.open ('somefile.txt', 'r') {| f | f.each_line {| satır | satırı koyar}} de çalışır. Teşekkürler! – OldTroll