もっと簡単にデバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法
昨日の日記で、メソッドの呼び出し元をログに出力する方法について書いた。 それは、メソッド内で意図的に例外を発生させ、例外オブジェクトのスタックトレースから呼び出し元を知るというもの。 そうしたら、caller メソッドを使ってスタックトレースが取得できるツッコミをいただいた。 caller メソッドは知らなかったので、両者を比較してみた。
例外オブジェクトからスタックトレースを得る方法(昨日の日記より)
def some_method begin raise Exception.new rescue Exception => e STDERR.puts e.backtrace.join(", ") end # ここから関数本体 end
caller メソッドでスタックトレースを得る方法(ツッコミでのご指摘)
def some_method STDERR.puts caller.join(", ") # ここから関数本体 end
まとめ
どうみても caller メソッドの方がシンプル。 これだけで終わっては面白くないので、 caller の戻り値を調べてみた。 戻り値は文字列の配列で、文字列はスタックトレースと同じ形式 (ファイル名:行番号:メソッド名) になってた。
$ irb irb(main):001:0> c = caller => ["/opt/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'", "/opt/local/lib/ruby/1.8/irb/workspace.rb:52"] irb(main):002:0> c.class => Array # caller の戻り値は文字列の配列 irb(main):003:0> c.first.class => String irb(main):004:0> puts c # 文字列はスタックトレースと同じ形式 (ファイル名:行番号:メソッド名) /opt/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding' /opt/local/lib/ruby/1.8/irb/workspace.rb:52 => nil