2

次のようなRubyコードを書いて、(たとえばスクリプトから)呼び出されたすべてのメソッドによって返される値を確認したいと思います:

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

これは可能ですか?return_value上記のコードの範囲内で、どうにかしてを取得できますか?

4

2 に答える 2

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
于 2013-03-15T17:43:01.477 に答える
1

誰かがまだ 1.9.3 に興味を持っているなら、これを行うためのぎこちない方法があります:

ハンドラーeval(code, binding)内から呼び出された関数を評価し、メモした戻り値を評価するために使用できます。set_trace_funceval

呼び出し元コードを自分で再構成する必要があります。何かのようなもの:

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文書化されていないようです。また、悪を利用します。

于 2013-09-21T01:26:33.003 に答える