我理解你经常在Ruby中使用的正常puts
函数写入stdout out是在模块Kernel
中定义的,所以为了覆盖它你只需要这样做:
module Kernel
def puts(*args)
# do custom logic
end
end
但是,覆盖此功能似乎不会影响STDERR.puts
。 STDERR.puts
定义了什么模块?
谢谢
这是IO
。你可以这样检查:
STDERR.method(:puts).owner
#=> IO
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)