Ruby:STDERR.puts在哪里定义?

问题描述 投票:0回答:3

我理解你经常在Ruby中使用的正常puts函数写入stdout out是在模块Kernel中定义的,所以为了覆盖它你只需要这样做:

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

但是,覆盖此功能似乎不会影响STDERR.putsSTDERR.puts定义了什么模块?

谢谢

ruby stdout stderr puts
3个回答
0
投票

这是IO。你可以这样检查:

STDERR.method(:puts).owner
#=> IO

0
投票

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

  1. STDERR重新分配给您自己设计的新对象(可能是一个坏主意)
  2. 覆盖IO#puts(绝对是个坏主意)
  3. def STDERR.puts ....(不是一个坏主意;但我无法想象自己这样做)

0
投票
[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)
© www.soinside.com 2019 - 2024. All rights reserved.