为了在我的脚本中处理-q(安静)选项,我这样做了:
class NoWrite
def write(*args)
end
end
$stdout = NoWrite.new if $options[:quiet]
工作正常
但是我想知道是否没有一种元编程方法使write
方法没有实际意义。
remove_method
和undef_method
无法使用,因为必须定义write
方法,我只是想让它什么都不做。
此外,$stderr
不会受到影响。
答案 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
答案 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]