binding
Kernel#bindingを使ってBindingオブジェクトを得ると、「環境」(評価を行うためのコンテキスト情報)を得ることができます。evalの第二引数にBindingオブジェクトを渡すと、その環境を用いて式を評価することができます。
ri Bindingの解説によれば、Kernel#set_trace_funcのコールバックでも使えるようです。なるほど。「このポイントでこの式を評価するとどうなるか」を試せるのですね。
以下の例では、再帰的に実装したfactorialメソッドの各ステップでの環境を配列$envに保持しており、後から「あの時点で"[n, f]"を評価したら」を表示しています。
$env = Array.new def factorial(n) f = 1 if n <= 0 f else f = factorial(n - 1) f *= n end $env[n] = binding() f end p factorial(10) (0..10).each do |i| p eval("[n, f]", $env[i]) end
実行結果です。
3628800 [0, 1] [1, 1] [2, 2] [3, 6] [4, 24] [5, 120] [6, 720] [7, 5040] [8, 40320] [9, 362880] [10, 3628800]