1

スクリプトで -q (quiet) オプションを処理するために、次のようにしました。

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

それは正常に動作します。
しかし、メソッドを無意味にするメタプログラミングの方法がないかどうか疑問に思っていwriteます。

remove_methodメソッドを定義する必要がundef_methodあるため使用できませwriteん。何もしないようにしたいだけです。

また、$stderr影響を受けることはできません。

4

2 に答える 2

3

または、stdout を次の場所にリダイレクトできます。/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/にあります。

于 2013-02-18T16:35:05.253 に答える
2

これには instance_eval を使用できます。

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

または、匿名クラスを作成できます。

$stdout = Class.new{ def self.write(*args); end } if $options[:quiet]
于 2013-02-18T16:47:58.550 に答える