Ruby: Где определен STDERR.puts? - PullRequest
0 голосов
/ 15 февраля 2019

Я понимаю, что обычная puts функция, которую вы регулярно используете в Ruby для записи в stdout out, определена в модуле Kernel, поэтому для ее переопределения вы просто должны сделать что-то вроде этого:

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

Однако переопределение этой функции put, похоже, не влияет на STDERR.puts.В каком модуле определено STDERR.puts?

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
[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)
0 голосов
/ 15 февраля 2019

Это IO.Вы можете проверить это так:

STDERR.method(:puts).owner
#=> IO
0 голосов
/ 15 февраля 2019

STDERR является экземпляром IO;который отдельно переопределяет puts.Таким образом, здесь можно сделать две разные вещи:

  1. Переназначить STDERR на новый объект собственного дизайна (вероятно, плохая идея)
  2. Переопределить IO#puts (определенноплохая идея)
  3. def STDERR.puts .... (не такая уж плохая идея, но я не могу себе этого позволить)
...