From: Jacob Fugal Date: 2006-12-09T09:07:36+09:00 Subject: Re: beginner Q: Kernel#puts, STDOUT, $stdout relation On 12/8/06, Andreas S wrote: > >From: Daniel Finnie > >Reply-To: ruby-talk@ruby-lang.org > >To: ruby-talk@ruby-lang.org (ruby-talk ML) > >Subject: Re: beginner Q: Kernel#puts, STDOUT, $stdout relation > >Date: Sat, 9 Dec 2006 07:28:20 +0900 > > > >Puts is a method of Kernel. > > But, doesn't it depend on what IO object $stdout holds? I redefined $stdout > 'puts' function, but why it does not affect Kernel's puts method? It's a tricky relationship, and I'm not quite sure how or why it works this way, but Kernel#puts does not use STDOUT's (or $stdout, they can be different) puts. It does use STDOUT/$stdout (I'm not really sure which) but IIRC Kernel#puts is implemented directly using the write method. Caveat here though -- the write method is called *twice*, once for the argument, then again for the newline. So modifying your source to rewrite "write" instead of "puts": class << STDOUT def write(*args) args[0] = "I say " + args[0] unless args.empty? super(args) end end puts "hello" STDOUT.puts "hello" $stdout.puts "hello" produces: $ ruby test.rb I say helloI say I say helloI say I say helloI say Jacob Fugal