Rails: includeされた時にクラスメソッドとインスタンスメソッドを同時に追加する頻出パターン


こんにちは、鈴木です。

 

モジュールの include と extend は慣れるまではややこしいですね。

ライブラリを使用する時に、提供されているモジュールを include すれば良いのか、extend すれば良いのか迷うこともあると思います。

えぇーい、面倒くさい! ということで生まれたかどうかは知りませんが、モジュールに関する頻出パターンをご紹介します。

「モジュールが include された時に、クラスメソッドとインスタンスメソッドの両方を追加する」という手法です。

この手法を使うと、何も考えずに include すれば便利なクラスメソッドやインスタンスメソッドが使えるようになるモジュールを作ることができます。

 

includeされた時にクラスメソッドとインスタンスメソッドを同時に追加する頻出パターン

このような時の頻出パターンとして、以下のようなコードが書かれることが多いです。

YourModule を include すると、bye メソッドはインスタンスメソッドとして使えるようになります。そして、ネストしている ClassMethods モジュールで定義されている hello はクラスメソッドとして使えるようになります。

 

モジュールの include と extend

この動作を理解するために、モジュールの include と extend についておさらいしましょう。

例として、ログ出力機能を提供する Logging というモジュールがあるとします。

Logging モジュールを include すると、インスタンスメソッドとして log メソッドを使えるようになります。

Logging モジュールを extend すると、クラスメソッドとして log メソッドを使えるようになります。

 

include されたときに included が呼ばれる

モジュールに included メソッドを定義しておくと、モジュールが include された時に呼び出されます。

included の引数は include したクラスやモジュールです。

それに対して extend すれば、include されたときにクラスメソッドも同時に追加することができる、という仕組みです。

 

まとめ

モジュールの include と extend の動作、そして include したときに included メソッドが呼ばれることが分かれば、冒頭の頻出パターンのコードを理解することができますね。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です