1

为了在我的脚本中处理 -q (安静)选项,我这样做了:

class NoWrite
  def write(*args)
  end
end
$stdout = NoWrite.new if $options[:quiet]

它工作正常。
但是我想知道是否没有一种元编程方式可以使该write方法没有实际意义。

remove_method并且undef_method不能使用,因为write必须定义方法,我只想让它什么都不做。

而且,$stderr不能影响。

4

2 回答 2

3

或者,您可以将标准输出重定向到/dev/null

def stfu
  begin
    orig_stdout = $stdout.clone
    $stdout.reopen File.new('/dev/null', 'w')
    retval = yield
  rescue Exception => e
    $stdout.reopen orig_stdout
    raise e
  ensure
    $stdout.reopen orig_stdout
  end
  retval
end

require 'some_noisy_gem'
stfu do
  some_function_that_generates_a_lot_of_cruft_on_stdout
end

原始片段位于:https ://jacob.hoffman-andrews.com/README/index.php/2011/04/14/ruby-function-stfu-temporarily-redirect-noisy-stdout-writes-to-devnull/

于 2013-02-18T16:35:05.253 回答
2

您可以为此使用 instance_eval:

$stdout.instance_eval{ def write(*args); end } if $options[:quiet]

或者你可以创建一个匿名类:

$stdout = Class.new{ def self.write(*args); end } if $options[:quiet]
于 2013-02-18T16:47:58.550 回答