Ruby:STDERR.puts是在哪里定义的?
Ruby: Where is STDERR.puts defined?
我知道您在 Ruby 中经常使用的用于写入标准输出的正常 puts
函数是在模块 Kernel
中定义的,因此要覆盖它,您只需执行像这样:
module Kernel
def puts(*args)
# do custom logic
end
end
但是,覆盖此 puts 函数似乎不会影响 STDERR.puts
。 STDERR.puts
定义在哪个模块?
谢谢
STDERR
是 IO
的实例;它分别覆盖 puts
。所以你可以在这里做两件事:
- 重新分配
STDERR
给你自己设计的新对象(可能是一个坏的
想法)
- 覆盖
IO#puts
(绝对是个坏主意)
def STDERR.puts ....
(这主意不错;但我无法想象自己会这样做)
[32] pry(main)> STDERR.class
=> IO
[33] pry(main)> STDERR.method(:puts)
=> #<Method: IO#puts>
[34] pry(main)> class IO
[34] pry(main)* def puts(arg)
[34] pry(main)* raise "OVERRIDE"
[34] pry(main)* end
[34] pry(main)* end
=> :puts
[35] pry(main)> STDERR.puts "test"
(pry):35:in `puts': OVERRIDE (RuntimeError)
是IO
。你可以这样检查:
STDERR.method(:puts).owner
#=> IO
我知道您在 Ruby 中经常使用的用于写入标准输出的正常 puts
函数是在模块 Kernel
中定义的,因此要覆盖它,您只需执行像这样:
module Kernel
def puts(*args)
# do custom logic
end
end
但是,覆盖此 puts 函数似乎不会影响 STDERR.puts
。 STDERR.puts
定义在哪个模块?
谢谢
STDERR
是 IO
的实例;它分别覆盖 puts
。所以你可以在这里做两件事:
- 重新分配
STDERR
给你自己设计的新对象(可能是一个坏的 想法) - 覆盖
IO#puts
(绝对是个坏主意) def STDERR.puts ....
(这主意不错;但我无法想象自己会这样做)
[32] pry(main)> STDERR.class
=> IO
[33] pry(main)> STDERR.method(:puts)
=> #<Method: IO#puts>
[34] pry(main)> class IO
[34] pry(main)* def puts(arg)
[34] pry(main)* raise "OVERRIDE"
[34] pry(main)* end
[34] pry(main)* end
=> :puts
[35] pry(main)> STDERR.puts "test"
(pry):35:in `puts': OVERRIDE (RuntimeError)
是IO
。你可以这样检查:
STDERR.method(:puts).owner
#=> IO