2013-02-18 48 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