2013-03-15 135 views
2

我想写一些Ruby代码这样看所谓的(,比如说,从脚本)由每一个方法的返回值:是否有可能从set_trace_func返回值?

set_trace_func proc { |event, file, line, id, binding, classname| 
    if event == "return" 
    puts "returning #{return_value} from #{classname}.#{id}" 
    end 
} 

这可能吗?不知何故,我可以在上面的代码范围内获得return_value吗?

回答

5

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

如果有人仍有意在1.9.3,有做这个cludgy方式:

您可以set_trace_func内使用eval(code, binding)评价一个调用的函数从处理程序,然后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的输出出现无证。另外,它使用邪恶。

相关问题