Ruby で非常に興味深い壊滅的な動作が見られます。以下のコードを参照してください。
class ExceptionTest
def test
@result = [0]*500000
begin
no_such_method
rescue Exception => ex
puts "before #{ex.class}"
st = Time.now
ex.message
puts "after #{Time.now-st} #{ex.message}"
end
end
end
ExceptionTest.new.test
理想的ex.message
には実行に時間がかからないため、所要時間はミリ秒単位である必要がありますが、ここに出力があります
before NameError
after 0.462443 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007fc74a84e4f0>
[0]*500000
インスタンス変数の代わりにローカル変数に割り当てると、たとえばresult = [0]*500000
期待どおりに実行されます
before NameError
after 2.8e-05 undefined local variable or method `no_such_method' for #<ExceptionTest:0x007ff59204e518>
どういうわけかインスタンス変数を介してループしているように見えex.message
ますが、なぜそうなるのか教えてください!
ruby ruby-1.9.2-p290、ruby-1.9.1-p376、ruby 2.0.0、および codepad.org の ruby のバージョンで試しました。