为了在我的脚本中处理 -q (安静)选项,我这样做了:
class NoWrite
def write(*args)
end
end
$stdout = NoWrite.new if $options[:quiet]
它工作正常。
但是我想知道是否没有一种元编程方式可以使该write
方法没有实际意义。
remove_method
并且undef_method
不能使用,因为write
必须定义方法,我只想让它什么都不做。
而且,$stderr
不能影响。
为了在我的脚本中处理 -q (安静)选项,我这样做了:
class NoWrite
def write(*args)
end
end
$stdout = NoWrite.new if $options[:quiet]
它工作正常。
但是我想知道是否没有一种元编程方式可以使该write
方法没有实际意义。
remove_method
并且undef_method
不能使用,因为write
必须定义方法,我只想让它什么都不做。
而且,$stderr
不能影响。
或者,您可以将标准输出重定向到/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
您可以为此使用 instance_eval:
$stdout.instance_eval{ def write(*args); end } if $options[:quiet]
或者你可以创建一个匿名类:
$stdout = Class.new{ def self.write(*args); end } if $options[:quiet]