Effective Ruby 第5章まとめ

こんにちは!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フックが実行される。


出典: https://www.shoeisha.co.jp/book/detail/9784798139821