Andreas_S
(Andreas S)
8 December 2006 22:16
1
Can anybody help me understanding the relation between Kernel#puts, STDOUT and $stdout?
I thought 'puts' is equivalent to '$stdout.puts'. Why 'puts' doesn't give same result as 'STDOUT.puts'?
class << STDOUT
def puts(*args)
args[0] = "I say " + args[0] unless args.empty?
super(args)
end
end
puts "hello"
STDOUT.puts "hello"
$stdout.puts "hello"
=> hello
I say hello
Thank you in advance
-andre
···
_________________________________________________________________
Talk now to your Hotmail contacts with Windows Live Messenger. http://clk.atdmt.com/MSN/go/msnnkwme0020000001msn/direct/01/?href=http://get.live.com/messenger/overview
Puts is a method of Kernel.
Andreas S wrote:
···
Can anybody help me understanding the relation between Kernel#puts, STDOUT and $stdout?
I thought 'puts' is equivalent to '$stdout.puts'. Why 'puts' doesn't give same result as 'STDOUT.puts'?
class << STDOUT
def puts(*args)
args[0] = "I say " + args[0] unless args.empty?
super(args)
end
end
puts "hello"
STDOUT.puts "hello"
$stdout.puts "hello"
=> hello
I say hello
Thank you in advance
-andre
_________________________________________________________________
Talk now to your Hotmail contacts with Windows Live Messenger. http://clk.atdmt.com/MSN/go/msnnkwme0020000001msn/direct/01/?href=http://get.live.com/messenger/overview
Can anybody help me understanding the relation between Kernel#puts, STDOUT and $stdout?
I thought 'puts' is equivalent to '$stdout.puts'. Why 'puts' doesn't give same result as 'STDOUT.puts'?
class << STDOUT
def puts(*args)
args[0] = "I say " + args[0] unless args.empty?
super(args)
end
end
puts "hello"
This calls $stdout.write "hello\n"
STDOUT.puts "hello"
$stdout.puts "hello"
=> hello
I say hello
PS:
Please mess with $stdout, not STDOUT, if at all possible.
http://blog.segment7.net/articles/2006/08/17/stdout-vs-stdout
···
On Dec 8, 2006, at 14:16 , Andreas S wrote:
--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
I LIT YOUR GEM ON FIRE!
Andreas_S
(Andreas S)
8 December 2006 22:42
4
From: Daniel Finnie <danfinnie@optonline.net>
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?
···
_________________________________________________________________
Talk now to your Hotmail contacts with Windows Live Messenger. http://clk.atdmt.com/MSN/go/msnnkwme0020000001msn/direct/01/?href=http://get.live.com/messenger/overview
Andreas_S
(Andreas S)
9 December 2006 00:49
5
Ah, yes, I decided to snoop around in the c files and this fits what I thought I saw in there.
Thanks so much to all.
Regards,
-andre
···
From: Eric Hodel <drbrain@segment7.net>
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 09:39:56 +0900
On Dec 8, 2006, at 14:16 , Andreas S wrote:
Can anybody help me understanding the relation between Kernel#puts, STDOUT and $stdout?
I thought 'puts' is equivalent to '$stdout.puts'. Why 'puts' doesn't give same result as 'STDOUT.puts'?
class << STDOUT
def puts(*args)
args[0] = "I say " + args[0] unless args.empty?
super(args)
end
end
puts "hello"
This calls $stdout.write "hello\n"
STDOUT.puts "hello"
$stdout.puts "hello"
=> hello
I say hello
PS:
Please mess with $stdout, not STDOUT, if at all possible.
http://blog.segment7.net/articles/2006/08/17/stdout-vs-stdout
--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
I LIT YOUR GEM ON FIRE!
_________________________________________________________________
Talk now to your Hotmail contacts with Windows Live Messenger. http://clk.atdmt.com/MSN/go/msnnkwme0020000001msn/direct/01/?href=http://get.live.com/messenger/overview
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
Jacob Fugal
···
On 12/8/06, Andreas S <andreas_s@hotmail.com> wrote:
>From: Daniel Finnie <danfinnie@optonline.net>
>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?