[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

closing files with abrupt interruptions

Daniel Brumbaugh Keeney

2/15/2008 1:40:00 PM

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

2 Answers

Peter Hickman

2/15/2008 1:49:00 PM

0

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'.


Robert Klemme

2/15/2008 10:07:00 PM

0

On 15.02.2008 14:39, Daniel Brumbaugh Keeney wrote:
> 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
from :0
irb(main):005:0> p io, io.closed?
#<File:x (closed)>
true
=> nil

Cheers

robert