self[name] -> object | nil
[permalink][rdoc][edit]-
name に対応したスレッドに固有のデータを取り出します。 name に対応するスレッド固有データがなければ nil を返します。
- [PARAM] name:
- スレッド固有データのキーを文字列か Symbol で指定します。
[ Thread.new { Thread.current["name"] = "A" }, Thread.new { Thread.current[:name] = "B" }, Thread.new { Thread.current["name"] = "C" } ].each do |th| th.join puts "#{th.inspect}: #{th[:name]}" end # => #<Thread:0x00000002a54220 dead>: A # => #<Thread:0x00000002a541a8 dead>: B # => #<Thread:0x00000002a54130 dead>: C
Thread#[] と Thread#[]= を用いたスレッド固有の変数は Fiber を切り替えると異なる変数を返す事に注意してください。
def meth(newvalue) begin oldvalue = Thread.current[:name] Thread.current[:name] = newvalue yield ensure Thread.current[:name] = oldvalue end end
この関数に与えるブロックがFiberを切り替える場合は動的スコープとしては正しく動作しません。
f = Fiber.new { meth(1) { Fiber.yield } } meth(2) { f.resume } f.resume p Thread.current[:name] # => nil if fiber-local # => 2 if thread-local (The value 2 is leaked to outside of meth method.)
Fiber を切り替えても同じ変数を返したい場合は Thread#thread_variable_get と Thread#thread_variable_set を使用してください。
[SEE_ALSO] Thread#fetch, Thread#[]=