From: Robert Klemme Date: 2010-07-01T04:35:07+09:00 Subject: Re: Reading String Data as a File On 30.06.2010 20:26, Brian Candler wrote: > Robert Klemme wrote: >> The non block form obviously returns the Tempfile instance and if you >> want it to be returned from the block what stops you from explicitly >> returning it? > > Only that it's a bit verbose: > > tf = nil > Tempfile.open(...) do |io| > tf = io > ... > end > puts tf.path No, I was talking about the other version which returns whatever the block returns. You would do tf = Tempfile.open(...) do |io| ... io end puts tf.path > http://redmine.ruby-lang.org/issues/show/504 Apparently people differ in their preferences. >> IMHO the method with block should return whatever the implementor of the >> block chooses. That is far more reusable than always returning the >> Tempfile. > > Maybe that's what the accepted patch does - I haven't tested it. It > would be consistent with File.open { ... } if it worked that way. Exactly that is what the patch does: http://redmine.ruby-lang.org/repositories/diff/ruby-19?rev=19454 > Anyway, I think we're talking about minutiae. You say that one should > close the file at the earliest opportunity to "save resources", but the > only resource we're talking about is one slot in the kernel file > descriptor table, and most apps aren't going to be constrained by that. That's true. But I also have seen issues caused by files being opened more than once by the same process. Plus, you'll notice much faster if you try to write to the tempfile after you thought you were done when you close the file. If the code is more complicated these bugs can be hard to track. How much simpler is it if you see this: irb(main):006:0> Tempfile.open "x" do |io| irb(main):007:1* p io irb(main):008:1> io.puts "hello" irb(main):009:1> io.close irb(main):010:1> io.puts "world" irb(main):011:1> end # IOError: closed stream from (irb):10:in `block in irb_binding' from /usr/local/lib/ruby19/1.9.1/tempfile.rb:199:in `open' from (irb):6 from /usr/local/bin/irb19:12:in `
' It's probably not that big a deal but I believe such discussions bring benefit to the community by presenting alternative solutions to a problem along with arguments. I always like this food for thought. Thanks for sharing your thoughts! Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/