Странное поведение с нитями и волокнами

Этот код:

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 во вложенном волокне? Чем это можно объяснить?

1 ответ

Решение

Thread#[] а также Thread#[]= не локально для потока, а для волокна. Эта путаница не существовала в Ruby 1.8, потому что волокна были доступны только после Ruby 1.9. Ruby 1.9 выбирает, что методы ведут себя локально, чтобы сохранить следующие идиомы для динамической области видимости.

- Тема класса док

Другие вопросы по тегам