Julia言語で標準出力をリダイレクトしたStringを得る

今日は IOBuffer に使える redirect_stdout のオーバーロードを作った。取り急ぎ Gist として公開してある。Twitterでも呟いてるけれど。

Julia言語では標準ライブラリに redirect_stdout という関数が用意されており、これを使うと一時的に標準出力への書き込みを横取りすることができる。ドキュメントの雰囲気的には外部コマンドの出力を取り込んだりすることを想定しているようなのだけれど、この機構は標準出力への書き出しを行うプログラムの単体テストにも使える。つまり、テスト対象の関数を呼び出す間だけ標準出力に書き出されるデータを横取りして String に格納し、後で期待した内容かどうかを確認する。

が、いざ使おうとしたところマニュアルの情報は不足していて使い方がよく分からなかった。そこでJuliaのソースを読みつつ調べたところ、どうにもメモリー上に確保したバッファへリダイレクトすることはできないように読めた。なので、それをやるオーバーロード関数を作ってみた次第。do 構文を使って、次のような感じで使える。

julia> buf = IOBuffer();
julia> redirect_stdout(buf) do
           print("Hello, World!")
       end
julia> String(take!(buf))
"Hello, World!"

なんでこの機能、標準で無いんだろうなぁ。