Techioz Blog

STDOUT を文字列にキャプチャするにはどうすればよいですか?

概要

puts "hi"
puts "bye"

これまでのコードのSTDOUTを保存したいと思います(この場合、こんにちは bye 変数に「result」と言って印刷してください)

puts result

これを行う理由は、R コードを Ruby コードに統合しており、その出力は R コードの実行時に STDOUT に与えられますが、一部の評価を行うためにコード内で出力にアクセスすることはできません。混乱していたらごめんなさい。したがって、「puts result」行はこんにちはとさようならを与えるはずです。

解決策

次のメソッドは、stdout をキャプチャして文字列として返すための便利な汎用ツールです。 (標準出力に出力されたものを検証する単体テストでこれを頻繁に使用します。)特に、復元する (そして驚くことを避けるため) ための ensure 句の使用に注意してください。

def with_captured_stdout
  original_stdout = $stdout  # capture previous value of $stdout
  $stdout = StringIO.new     # assign a string buffer to $stdout
  yield                      # perform the body of the user code
  $stdout.string             # return the contents of the string buffer
ensure
  $stdout = original_stdout  # restore $stdout to its previous value
end

たとえば、次のようになります。

>> str = with_captured_stdout { puts "hi"; puts "bye"}
=> "hi\nbye\n"
>> print str
hi
bye
=> nil