Binding.of_caller


Binding.of_caller を調べてみました。クリティカルセーフなのはもちろん、継続を使って効率良く caller bindingを取得してます。(るびまの記事で解説があったのにきちんと理解できてなかったよ。。)たとえば、関数Aから呼び出された関数Bの中で Binding.of_caller を使うと以下のような流れになります。


AからBを呼び出す->B内でBinding.of_caller(&block)を実行->継続ポイントをセット->set_trace_funcをセット->関数Bからreturnして関数Aに戻る->set_trace_func により継続ポイントから再開->関数Aのbindingを取得->Aのbindingをパラメータにして blockを実行。


ただし、Binding.of_caller は関数Bの最後の式にしないと set_trace_funcが期待通りに動かない(このために Binding.of_callerはクロージャになっている)。ややこしいけど、うまいなぁ。自分で実装してたら思いつかないな。