Ruby でフックできるイベント一覧

Ruby でフックできるイベントを調べてみました。

# イベント一覧

## メソッド一覧

| メソッド名                                                                                                              | 呼び出されるタイミング                                          |
|:------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------|
| [method_missing](https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/method_missing.html)                         | 存在しないメソッドが呼び出された時                              |
| [const_missing](https://docs.ruby-lang.org/ja/latest/method/Module/i/const_missing.html)                                | 存在しない定数を参照した時                                      |
| [respond_to_missing?](https://docs.ruby-lang.org/ja/latest/method/Object/i/respond_to_missing=3f.html)                  | `respond_to?` の結果が `false` の時                             |
| [method_added](https://docs.ruby-lang.org/ja/latest/method/Module/i/method_added.html)                                  | メソッドが追加された時                                          |
| [method_removed](https://docs.ruby-lang.org/ja/latest/method/Module/i/method_removed.html)                              | メソッドが `remove_method` によって削除された時                 |
| [method_undefined](https://docs.ruby-lang.org/ja/latest/method/Module/i/method_undefined.html)                          | メソッドが `undef_method` か `undef` によって削除された時       |
| [singleton_method_added](https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/singleton_method_added.html)         | 特異メソッドが追加された時                                      |
| [singleton_method_removed](https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/singleton_method_removed.html)     | 特異メソッドが `remove_method` によって削除された時             |
| [singleton_method_undefined](https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/singleton_method_undefined.html) | 特異メソッドが `undef_method` か `undef` によって削除された時   |
| [prepend_features](https://docs.ruby-lang.org/ja/latest/method/Module/i/prepend_features.html)                          | `Module#prepend` の実体                                         |
| [prepended](https://docs.ruby-lang.org/ja/latest/method/Module/i/prepended.html)                                        | `Module#prepend` した後                                         |
| [append_features](https://docs.ruby-lang.org/ja/latest/method/Module/i/append_features.html)                            | `Module#include` の実体                                         |
| [included](https://docs.ruby-lang.org/ja/latest/method/Module/i/included.html)                                          | `Module#include` した後                                         |
| [extend_object](https://docs.ruby-lang.org/ja/latest/method/Module/i/extend_object.html)                                | `Object#extend` の実体                                          |
| [extended](https://docs.ruby-lang.org/ja/latest/method/Module/i/extended.html)                                          | `Object#extend` した後                                          |
| [inherited](https://docs.ruby-lang.org/ja/latest/method/Class/i/inherited.html)                                         | クラスのサブクラスが定義された時                                |
| [at_exit](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/at_exit.html)                                            | プログラム終了時                                                |

## TracePoint イベント一覧

TracePoint でフックできるイベントは以下のようになっています。

| イベント         | 説明                                               |
|:-----------------|:---------------------------------------------------|
| :line            | 式の評価                                           |
| :class           | クラス定義、特異クラス定義、モジュール定義への突入 |
| :end             | クラス定義、特異クラス定義、モジュール定義の終了   |
| :call            | Ruby で記述されたメソッドの呼び出し                |
| :return          | Ruby で記述されたメソッド呼び出しからのリターン    |
| :c_call          | Cで記述されたメソッドの呼び出し                    |
| :c_return        | Cで記述されたメソッド呼び出しからのリターン        |
| :raise           | 例外の発生                                         |
| :b_call          | ブロックの開始                                     |
| :b_return        | ブロックの終了                                     |
| :thread_begin    | スレッドの開始                                     |
| :thread_end      | スレッドの終了                                     |
| :fiber_switch    | ファイバーの切り替え                               |
| :script_compiled | スクリプトが ISeq に変換された後                   |

TracePoint のサンプルコードについては [Ruby の TracePoint について調べてみた#トレース出来るイベントの種類](https://qiita.com/siman/items/9426ff6c113247088f7e#%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E5%87%BA%E6%9D%A5%E3%82%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E7%A8%AE%E9%A1%9E) を参照して下さい。

[set_trace_func](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/set_trace_func.html) でも同様なイベントが取得可能ですが、 TracePoint に比べると取得出来るイベントの種類も少ない & 使い勝手が悪いので今はあまり使われていないかもしれません。


## 変数のトレース

| メソッド名                                                                       | 説明                                               | 備考                                                                                     |
|:---------------------------------------------------------------------------------|:---------------------------------------------------|:-----------------------------------------------------------------------------------------|
| [trace_var](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/trace_var.html) | グローバル変数のトレース                          | [Rubyのグローバル変数をトレースする](https://qiita.com/siman/items/2398b848c36cbf3f3011) |