File.open и блоки в Ruby 1.8.7 - PullRequest
6 голосов
/ 26 июля 2011

Я довольно новичок в ruby, и сейчас я читаю книгу «Кирка», чтобы ознакомиться со всем.Я натолкнулся на раздел File.open, где обсуждается переход блока в качестве параметра к вызову File.open, после чего гарантируется, что файл закрыт.Теперь это звучит как совершенно блестящий способ избежать стрельбы себе в ногу, и, так как я опасно низко в пальцах ног, я полагаю, что я попробую.Вот что я написал (в irb, если это имеет значение):

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

Я ожидал, что файл somefile.txt будет открыт, прочитан, напечатан и закрыт, верно?Насколько я могу сказать, неправильно.Если я использую lsof, чтобы посмотреть на дескрипторы открытых файлов, он все еще открыт.Однако, если я делаю

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

Я неправильно использую блоки в этом примере или мне не удалось понять значение File.open при использовании с блоком.Я прочитал раздел ruby-doc.org, связанный с File.open , но это только подтверждает, что то, что я делаю, должно работать так, как ожидалось.

Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

8 голосов
/ 26 июля 2011

Чтобы закрыть файл после блока, вы должны передать блок File.open() напрямую, а не each:

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

File.open(…).each {…} просто повторяется по открытомуфайл, не закрывая его.

...