こんにちは!kossyです!
さて、今回はEffective Rubyの第5章の覚えておくべき事項を
ブログにまとめてみたいと思います。
前回までの章をまとめたものはこちら
Effective Ruby 第1章まとめ - その辺にいるWebエンジニアの備忘録
Effective Ruby 第2章まとめ - その辺にいるWebエンジニアの備忘録
Effective Ruby 第3章まとめ - その辺にいるWebエンジニアの備忘録
Effective Ruby 第4章まとめ - その辺にいるWebエンジニアの備忘録
第5章 メタプログラミング
5-1. モジュール、クラスフックを使いこなそう
- すべてのフックメソッドは、特異メソッドとして定義してなければならない。
- メソッドが追加、削除、定義解除されるときに呼び出されるフックは、メソッド名しか受け取らず、変更が行われるクラスは与えられない。クラス名が知りたい場合には、selfの値を使う。
- singleton_method_addedを定義すると、自分自身の呼び出しが発生する。
- extend_object、append_features、prepend_featuresメソッドをオーバーライドしてはならない。代わりに、extended、included、prependedフックを使おう。
5-2. クラスフックからはsuperを呼び出そう
- クラスフックの中にはsuper呼び出しを入れよう。
5-3. method_missingではなくdefine_methodを使うようにしよう
- method_missingではなくdefine_methodを使うようにしよう。
- どうしてもmethod_missingを使わなければならないときには、respond_to_missing?を定義することを検討しよう。
5-4. evalの多様な変種間の違いを把握しよう
- instance_evalやinstance_execで定義されるメソッドは、特異メソッドである。
- class_eval、module_eval、class_exec、module_execメソッドのレシーバは、モジュール、クラスに限られる。これらのどれかで定義されたメソッドは、インスタンスメソッドになる。
5-5. モンキーパッチの代わりとなるものを検討しよう
- Refinementsはもう実験的機能ではなくなったが、機能の成熟とともに変化する可能性はまだ残っている。
- Refinementsは、それを使いたい個々のレキシカルスコープでアクティブ化しなければならない
5-6. エイリアスチェイニングで書き換えたメソッドを呼び出そう
5-7. Procの引数の個数の違いに対応できるようにすることを検討しよう
- 弱いProcオブジェクトとは異なり、強いProcオブジェクトは、引数の個数が間違っていると、ArgumentError例外を生成する。
- Proc#arityメソッドを使えば、Procオブジェクトが期待する引数の数がわかる。正数なら、Procが期待する引数の数そのものを表す。負数なら、オプション引数があるということであり、その数は必須引数の個数の1の補数になっている。
5-8. モジュールのprependを使うときには慎重に考えよう
- prependメソッドを使うと、クラス階層内でレシーバの前にモジュールを挿入できる。これは、レシーバとスーパークラスの間にモジュールを挿入するincludeとは大きく異なる。
- included、extendedモジュールフックと同様にモジュールをprependするとprependedフックが実行される。