我想编写一些这样的 Ruby 代码来查看每个调用的方法(例如,脚本)返回的值:
set_trace_func proc { |event, file, line, id, binding, classname|
if event == "return"
puts "returning #{return_value} from #{classname}.#{id}"
end
}
这可能吗?return_value
不知何故,我可以在上面的代码范围内吗?
Ruby 2.0 有一个TracePoint
包含return_value
实例方法的新类。你可以像这样使用它:
trace_point = TracePoint.new(:return) do |t| # event type specification is optional
puts "returning #{t.return_value} from #{t.defined_class}.#{t.method_id}"
end
trace_point.enable
如果有人仍然对 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
在其处理程序的持续时间内已关闭。加上 的输出arguments
似乎没有记录。此外,它使用邪恶。