В чем разница между File.open () с и без блока? - PullRequest
3 голосов
/ 14 августа 2011

У меня есть 2 вопроса: 1 - Я не понимаю, что означает возвращаемый код:

File.open("a.txt") do |i|
  puts i
end

, пожалуйста, объясните мне.

2 - и, пожалуйста, объясните мне, чторазница между этим кодом и кодом ниже:

File.open("a.txt").each do |i|
  puts i
end

спасибо

Ответы [ 2 ]

6 голосов
/ 14 августа 2011

С:

File.open( "some_file.txt" ) do |file|
  puts file.read
end

Метод open вызывает ваш блок с экземпляром File и очищает ссылку на файл, как только ваш блок возвращает, закрывая и сбрасывая файл по мере необходимости, чтобы ваше приложение не пропускало обработчики файлов, что здорово. поскольку мы обычно забываем закрывать файлы или не учитывать, что обработка файлов может привести к исключениям.

Когда вы делаете это так:

file = File.open("some_file.txt")
puts file.read

Метод open предоставляет вам экземпляр File , но теперь вы отвечаете за очистку и закрытие файла, когда он вам больше не нужен. Поэтому, если вы делаете это следующим образом, вам, возможно, следует установить файл в блок begin / rescue и добавить условие гарантированного закрытия файла, если что-то пойдет не так.

Если у вас нет особых потребностей, вам никогда не следует использовать эту вторую версию, первая версия проще и безопаснее, и вам не нужно заботиться о закрытии / очистке того, что вы сделали с файлом.

2 голосов
/ 14 августа 2011

Как правило, вы можете ввести что-то столь же простое, как это прямо в консоли, и получить немедленный ответ.

То есть для файла a.txt с содержимым:

one
two
three

Ваш код будетсделать это:

[johnmartirano@mbp]$ irb
ruby-1.9.2-p180 :007 > File.open("a.txt") do |i|
ruby-1.9.2-p180 :008 >     puts "a.txt:"+i.to_s
ruby-1.9.2-p180 :009?>   end
a.txt:#<File:0x000001010e7ae8>
 => nil 
ruby-1.9.2-p180 :010 > File.open("a.txt").each do |i|
ruby-1.9.2-p180 :011 >     puts "a.txt:"+i.to_s
ruby-1.9.2-p180 :012?>   end
a.txt:one
a.txt:two
a.txt:three
 => #<File:a.txt> 

Таким образом, первый выводит ссылку / адрес объекта File.

Второй выполняет итерацию по строкам в файле и печатает каждую из них.

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...