2009/2/8 7stud -- <bbxx789_05ss / yahoo.com>: > In pickaxe2, on p. 335, it says that assigning to $stdout is deprecated > and to use $stdout.reopen() instead: > > -------------------------------------------------------------- IO#reopen > ios.reopen(other_IO) => ios > ios.reopen(path, mode_str) => ios > ------------------------------------------------------------------------ > Reassociates _ios_ with the I/O stream given in _other_IO_ or to a > new stream opened on _path_. This may dynamically change the actual > class of this stream. > > f1 = File.new("testfile") > f2 = File.new("testfile") > f2.readlines[0] #=> "This is line one\n" > f2.reopen(f1) #=> #<File:testfile> > f2.readlines[0] #=> "This is line one\n" > > > And there is this in the Standard LIbrary: > > StringIO > > Once a string is wrapped in a StringIO object, it can be read from and > written to as if it were an open file....It also lets you pass strings > into classes and methods that were originally written to work with > files. > > But I get an error trying to replace $stdout with a StringIO object: > > require "stringio" > > strio = StringIO.new > old_out = $stdout > $stdout.reopen(strio) > > --output:-- > r1test.rb:5:in `reopen': cannot convert StringIO into String (TypeError) > from r1test.rb:5 > > What am I doing wrong? Not reading the docs. It should be obvious from description of IO#reopen that you cannot use StringIO in this way because it does not have an underlying file descriptor. On the other hand, you can assign a StrinIO into $stdout but this will change only the global, not the file descriptors seen by C extensions or programs executed with system(). HTH Michal