puts の秘密

programmingrubyputs

Posted onOct 16, 2014


RubyTapas (Ruby プログラミングを扱った有料 スクリーンキャスト) のエピソード 171 ‘puts’ を観てヘェーと思ったのでメ モです。

t1 = Thread.new do
  10.times { puts 'apple' }
end

t2 = Thread.new do
  10.times { puts 'orange' }
end

t2.join
t1.join

実行結果:

apple
orange
orangeapple

apple
...

原因は引数文字列の出力と puts が最後に自動的に追加する改行の出力が、 それぞれ別の write として処理されるため。

解決方法は、ワザと最後に改行を入れてやる。こうすると puts が最後の改 行を取り除き、出力を一つの write として処理するので混じらない。

t1 = Thread.new do
  10.times { puts "apple\n" }
end

t2 = Thread.new do
  10.times { puts "orange\n" }
end