2

このコード:

Fiber.new do 
  Thread.current['a'] = 5

  p Thread.current.object_id
  p Thread.current['a']

  Fiber.new do 
    p Thread.current.object_id
    p Thread.current['a']
  end.resume

  p Thread.current.object_id
  p Thread.current['a']
end.resume

次の結果を示します。

3442840
5

3442840
nil

3442840
5

ネストされたファイバーでcurrent['a']戻るのはなぜですか? nilどのように説明できますか?

4

1 に答える 1

1

Thread#[]スレッドローカルでThread#[]=なく、ファイバーローカルです。この混乱は Ruby 1.8 には存在しませんでした。ファイバーは Ruby 1.9 以降でしか利用できなかったからです。Ruby 1.9 では、動的スコープ用に次のイディオムを保存するために、メソッドがファイバーローカルで動作することを選択しています。

— <a href="http://ruby-doc.org/core-2.0/Thread.html#method-i-5B-5D" rel="nofollow">スレッドクラスのドキュメント

于 2013-03-06T09:09:11.743 に答える