Closing files with abrupt interruptions

loop do
  File.open somefile, 'r' do |io|
    next
  end
end

Does somefile get closed?
How would I test that?
I have the same question if it raises an error (that gets rescued) or
throws a symbol.

Daniel Brumbaugh Keeney

Daniel Brumbaugh Keeney wrote:

loop do
  File.open somefile, 'r' do |io|
    next
  end
end

Does somefile get closed?
How would I test that?
I have the same question if it raises an error (that gets rescued) or
throws a symbol.

Daniel Brumbaugh Keeney

There are two ways to open a file for reading in ruby, the first is:

f = File.open("fred.txt", "r")
  f.each do |l|
    puts l
  end
f.close

in the above case you have to explicitly close the file, however with this:

File.open("fred.txt","r") do |f|
  f.each do |l|
    puts l
  end
end

The opened file is referenced by the variable f, however f is in the scope of the 'File.open() do ... end' and once the program goes past the closing 'end' the f will be removed. The deletion of the file handle triggers the close. So no need for an explicit close.

The second way is also more 'rubyish'.

loop do
  File.open somefile, 'r' do |io|
    next
  end
end

Does somefile get closed?

Yes. See also Peter's explanation.

How would I test that?

Easily:

robert@fussel ~
$ echo 1 > x

irb(main):001:0> io = nil
=> nil
irb(main):002:0> File.open("x") {|io| p io, io.closed?}
#<File:x>
false
=> nil
irb(main):003:0> p io, io.closed?
#<File:x (closed)>
true
=> nil

I have the same question if it raises an error (that gets rescued) or
throws a symbol.

irb(main):004:0> File.open("x") {|io| p io, io.closed?; raise "E"}
#<File:x>
false
RuntimeError: E
         from (irb):4
         from (irb):4:in `open'
         from (irb):4
irb(main):005:0> p io, io.closed?
#<File:x (closed)>
true
=> nil

Cheers

  robert

···

On 15.02.2008 14:39, Daniel Brumbaugh Keeney wrote:
         from :0