TakayukiKoyama Geek Blog

Create, Entertain, Experience

Ruby Thread.currentについて

目的

 Ruby 技術者認定試験合格教本の p312 に書いてあるカレントスレッドのコード例が良くない気がしたので、別の書き方を提案してみる。

コード例

> Thread.main
=> #<Thread:0x107c71278 run>
> t = Thread.new { sleep 100 }
=> #<Thread:0x107f838d0 sleep>
> Thread.current
=> #<Thread:0x107c71278 run>

 おそらく、このコードからは Thread.main でメインスレッドが表示され、 Thread.current を実行しているのもメインスレッドだから object_id (正確には、 object_id を '%x' % (t.object_id << 1) したやつ)が同じになるよね。と言いたいのかなと。

 ただ、これだと main と current の結果が同じで用途が伝わりにくい気がするので、 current を書く場所を変えたほうが良さそうに思いました。

提案

 ファイル実行の方が可読性が高くていいので、ファイル実行で記述。

$ vim sample.rb
t = Thread.new do
  p Thread.main
  p Thread.current
end

p Thread.list
p Thread.main


$ ruby sample.rb
[#<Thread:0x007fb0af8cb7e0 run>, #<Thread:0x007fb0b097dca0 run>]
#<Thread:0x007fb0b097dca0 run> # run or sleep
#<Thread:0x007fb0b097dca0 run>
#<Thread:0x007fb0af8cb7e0 run>

 これで main と current がどう変わるのかが分かりやすいのかなと。まあ紙面の都合もあると思うので、備忘録的な感じ。