誰かがまだ 1.9.3 に興味を持っているなら、これを行うためのぎこちない方法があります:
ハンドラーeval(code, binding)
内から呼び出された関数を評価し、メモした戻り値を評価するために使用できます。set_trace_func
eval
呼び出し元コードを自分で再構成する必要があります。何かのようなもの:
arg_arr = []
params = eval('method(__method__).parameters', binding)
params.each do |param|
case param[0]
when :req, :opt
arg_arr << param[1]
when :rest
arg_arr << '*' + param[1]
else
puts "Need handler for type #{param[0]}"
end
end
call_expr = "#{id} #{arg_arr.join(',')}"
puts "Call with <#{call_expr}>"
res = eval(call_expr, binding)
puts "sub-method #{id} returned #{res}"
eval("return #{res.inspect}", binding)
set_trace_func
ハンドラーの実行中はオフになっているため、これを行うことができるのは 1 レベル下だけです。さらに、の出力はarguments
文書化されていないようです。また、悪を利用します。