TracePoint では Ruby の処理におけるいろいろな イベント を受け取ることが出来ます。
取得できるイベント一覧
イベント | 説明 |
---|---|
:line | 式の評価 |
:class | クラス定義、特異クラス定義、モジュール定義への突入 |
:end | クラス定義、特異クラス定義、モジュール定義の終了 |
:call | Ruby で記述されたメソッドの呼び出し |
:return | Ruby で記述されたメソッド呼び出しからのリターン |
:c_call | Cで記述されたメソッドの呼び出し |
:c_return | Cで記述されたメソッド呼び出しからのリターン |
:raise | 例外の発生 |
:b_call | ブロックの開始 |
:b_return | ブロックの終了 |
:thread_begin | スレッドの開始 |
:thread_end | スレッドの終了 |
:fiber_switch | ファイバーの切り替え |
このイベントの中で以下の3つは return_value
で戻り値を取得することが出来ます。(他のイベントで呼び出すと例外が発生します)
return
c_return
b_return
サンプルコードとしてはこんな感じです。( c_return
はちょっと扱いにくいので省略してます )
TracePoint.trace(:return, :b_return) do |tp|
p [tp.event, tp.return_value]
end
def say
'hi'
end
say
(-> { 'piyo' }).call
実行結果
[:return, "hi"]
[:b_return, "piyo"]
追記
もう少しまとめたものを書きました。
参考サイト