From: Urabe Shyouhei Date: 2012-05-24T10:38:02+09:00 Subject: [ruby-dev:45674] Re: Bug?: level argument of caller callerの引数は0と1以外使ってるの見たことないので、どうでもいいんじゃないでしょうか。 修正してしまうのに一票。 On 05/24/2012 12:54 AM, SASADA Koichi wrote: >  ささだです. > >  caller(level) のように,caller メソッドでは何段上からバックトレースを > 持ってくるか,というのを level という引数で指定できます. > >  なんとなく,level 分だけバックトレースの情報が減るように思えるのです > が,つまり > > caller(0).size - level == caller(level).size > > となりそうなもんですが,実際はそうなりません. > > > 例: > > a = [1] > a.map{ > a.map{ > a.map{ > 10.times{|i| > p [i, caller(i).size] > } > } > } > } > #=> > ruby 2.0.0dev (2012-05-04 trunk 35535) [i386-mswin32_100] > [0, 9] > [1, 8] > [2, 8] # 上と変わらない > [3, 7] > [4, 6] > [5, 6] # 上と変わらない > [6, 5] > [7, 4] > [8, 4] # 上と変わらない > [9, 3] > >  理由は,level を,VM のスタックフレームを level 個スキップする,と扱っ > ているのですが,スタックフレームの種類によってはバックトレースに出てこな > い場合もあるので,そのスキップされた分を level でスキップする数にいれて > いるから,という理由です. > >  1.8 だと期待通り(?)動きます. > > #=> ruby 1.8.7 (2012-02-08 patchlevel 358) [i386-cygwin] > [0, 9] > [1, 8] > [2, 7] > [3, 6] > [4, 5] > [5, 4] > [6, 3] > [7, 2] > [8, 1] > [9, 0] > > >  というわけで,バグな気もするんですが,どうしたもんでしょう.これまで苦 > 情も来てないから,どうでもいいような気もするんですが.2.0 から直します? >