清除方法的主体

时间:2013-02-18 16:31:40

标签: ruby metaprogramming

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

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

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

remove_methodundef_method无法使用,因为必须定义write方法,我只是想让它什么都不做。

此外,$stderr不会受到影响。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

您可以使用instance_eval:

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

或者你可以做一个匿名课:

$stdout = Class.new{ def self.write(*args); end } if $options[:quiet]