局部变量在保证条款中变为零

时间:2015-05-18 17:01:42

标签: ruby

我偶然发现了一个我无法解释的奇怪行为。执行方法

def with_baton
  until (baton = Baton.obtain)
    sleep(2)
  end

  result = yield
ensure
  baton.release
  result
end

确保我们传递给它的块不会由多个worker并行执行,我有时会收到以下错误:

NoMethodError: undefined method `release' for nil:NilClass
lib/*hidden*/common.rb:172 in ensure in with_baton
lib/*hidden*/common.rb:173 in with_baton
lib/*hidden*/common.rb:7 in get

如果执行超过until,则表示baton已设置。它nil中的ensure怎么可能发生?顺便说一句,该块执行约五秒钟,我使用Ruby MRI 1.9.3-p547。

1 个答案:

答案 0 :(得分:1)

您的Baton.obtain可能会引发错误,在这种情况下,接力棒将为nil

致电baton.release if baton