ささだです.

 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 から直します?

-- 
// SASADA Koichi at atdot dot net