2013-02-18 100 views
1

为了处理在我的脚本-q(安静)选项,我这样做:清除方法体

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

它工作正常。
但是我想知道是否没有元编程的方法使write方法没有意义。

remove_methodundef_method无法使用,因为write方法必须定义,我只是想让它无所作为。

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

+0

你也可以覆盖'#method_missing'。 – 2013-02-18 17:11:56

回答

2

您可以使用instance_eval的这个:

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

或者你也可以做一个匿名类:

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

我更喜欢这个,它更独立于平台 – 2013-02-18 17:03:56

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/

+0

我更喜欢这种处理方式。它给'/ dev/null'做些事情。通常它坐在那里什么都不做。 – 2013-02-18 19:01:18

+0

@theTinMan:为什么'/ dev/null'在你的系统中无处肆虐? – PinnyM 2013-02-18 19:07:24