Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否可以从set_trace_func获取要返回的值?_Ruby_Trace - Fatal编程技术网

Ruby 是否可以从set_trace_func获取要返回的值?

Ruby 是否可以从set_trace_func获取要返回的值?,ruby,trace,Ruby,Trace,我想编写一些类似这样的Ruby代码,以查看调用的每个方法(例如,从脚本)返回的值: 这可能吗?我可以在上面代码的范围内获得return\u值吗?Ruby 2.0有一个新类,它包含一个return\u值实例方法。您可以这样使用它: trace_point = TracePoint.new(:return) do |t| # event type specification is optional puts "returning #{t.return_value} from #{t.define

我想编写一些类似这样的Ruby代码,以查看调用的每个方法(例如,从脚本)返回的值:

这可能吗?我可以在上面代码的范围内获得
return\u值吗?

Ruby 2.0有一个新类,它包含一个
return\u值
实例方法。您可以这样使用它:

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\u trace\u 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)
arg_arr=[]
params=eval('method('method.parameters',binding)
参数。每个都做|参数|
案例参数[0]
当:req,:opt
arg_arr
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)