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