From: Run Paint Run Run Date: 2009-07-10T05:25:53+09:00 Subject: [ruby-core:24240] [Bug #1755] IO#reopen Doesn't Fully Associate with Given Stream on 1.9; Ignores pos on 1.8 Bug #1755: IO#reopen Doesn't Fully Associate with Given Stream on 1.9; Ignores pos on 1.8 http://redmine.ruby-lang.org/issues/show/1755 Author: Run Paint Run Run Status: Open, Priority: Normal Category: core ruby -v: ruby 1.9.2dev (2009-07-08 trunk 23995) [i686-linux] $ cat io-reopen.rb file1 = File.open('a') file2 = File.open('b') file1.gets # => "ant\n" file2.gets # => "1\n" file1.reopen(file2) p file1.gets # => "2\n" $ echo -e "ant\nbear\ncroc" >a $ echo -e "1\n2\n3" >b $ ruby -v io-reopen2.rb ruby 1.9.2dev (2009-07-08 trunk 23995) [i686-linux] "bear\n" I have nothing against bears, but in this instance suspect 2 would be more appropriate. However, if we call `file.pos` before the #reopen, it works: $ cat io-reopen.rb file1 = File.open('a') file2 = File.open('b') file1.gets # => "ant\n" file2.gets # => "1\n" file1.pos # <--- Vital file1.reopen(file2) p file1.gets # => "2\n" $ ruby -v io-reopen2.rb ruby 1.9.2dev (2009-07-08 trunk 23995) [i686-linux] "2\n" Note that 1.8 prints nil in both cases because #reopen doesn't copy across the position. We must manually set file1.pos to file2.pos. $ cat io-reopen.rb file1 = File.open('a') file2 = File.open('b') file1.gets # => "ant\n" file2.gets # => "1\n" file1.reopen(file2) file1.pos = file2.pos # <-- 1.8 doesn't copy across the pos p file1.gets # => "2\n" $ ruby8 -v io-reopen2.rb ruby 1.8.8dev (2009-07-01) [i686-linux] "2\n" ---------------------------------------- http://redmine.ruby-lang.org