Ruby:STDERR.puts是在哪里定义的?

Ruby: Where is STDERR.puts defined?

我知道您在 Ruby 中经常使用的用于写入标准输出的正常 puts 函数是在模块 Kernel 中定义的,因此要覆盖它,您只需执行像这样:

module Kernel
  def puts(*args)
    # do custom logic
  end
end

但是,覆盖此 puts 函数似乎不会影响 STDERR.putsSTDERR.puts定义在哪个模块?

谢谢

STDERRIO 的实例;它分别覆盖 puts。所以你可以在这里做两件事:

  1. 重新分配 STDERR 给你自己设计的新对象(可能是一个坏的 想法)
  2. 覆盖 IO#puts(绝对是个坏主意)
  3. 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