Rubyのincludeとextendの賢い使い方

Rubyでのモジュールの上手な使い方をリストアップしてみた。

 

たとえばEngineというモジュールが作ってあって、それを利用する方法について考えてみる。

まずこれがEngineモジュールの定義だ。

基本的なincludeとextendの使い方

まずは基本的なincludeとextendの使い方の説明からはじめる。

 

Engineモジュールで定義したメソッドを、MyCarクラスのインスタンスメソッドとして追加する。

クラス宣言時にモジュールをincludeすると、そのクラスはインスタンス化したときに、includeしたモジュールにアクセスできるようになる。

 

続いて、特異メソッドとして追加する。

クラス宣言時にモジュールをextendすると、そのクラスは特異メソッドとして(つまりインスタンス化せずに)extendしたモジュールにアクセスできるようになる。

 

最初の例ではMyCarインスタンスにincludeしていたが、main(最上位の実行オブジェクト)にincludeして使用する場合は、モジュール名を省略して、Engineモジュールで定義されているメソッドをいきなり呼び出せるようになる。

 

ただしmainなんかにincludeしてしまうと、他のオブジェクトまでも汚染してしまうから、極力避けたほうがいい。

 

特異メソッド定義の際、selfの記述を省略できる。

本来、特異メソッドを定義するには、メソッド名の前に「self」を付加しメソッドを定義する。

extendをうまく使うと、特異メソッドを、毎回「self.メソッド名」とせずに記述することができる。

特異メソッドのみを複数作る必要がある場合には役立つと思う。

 

ひょっとすると、特異メソッドのみのクラスを同じように作れるか?

と思うかもしれないが、実はそうはいかない。

extendの引数には、モジュールしか指定することができないためだ。

だから、いったん匿名モジュールを作成してから、それをextendすればいい。

これで、匿名モジュール内のメソッド宣言で、「self.」を付けることなくメソッド宣言ができるようになった。

特異クラスは専用の構文が用意されている

さきほどはextendによる特異メソッドだけのクラスの作成方法を紹介した。

Rubyには、特異メソッドを作る場合の構文が用意されているから、特異メソッドを作る目的ならこちらのコードほうが正統派だ。

これはRuby1.9.3のマニュアルで紹介されているやり方。

既に定義されているEngineクラスに対し、class << クラス名とすることで、特異メソッドだけを追加することができるというもの。

 

だから、まずは特異メソッドを追加するためのクラスが無ければいけないので、そのクラスが無ければクラス名 = Class.newのように、まずクラスの定義を行なう必要がある。

 

個人的には、クラスが特異メソッドしか持つ必要が無い場合には、このようにクラス宣言を含めて一気に宣言するのが好み。

includeは名前空間の短縮に役立つ

includeは、各クラスの中で使用すれば、冗長なモジュール名(名前空間)参照の記述を短縮して記述することもできる。

例えば、このようなコードがある。

Net::HTTPのように、モジュール名を含めたクラス名で記述するのは面倒だし、ソースの可読性を下げることもある。

だから、クラス宣言の中で、Netモジュールをincludeしてやる。

こうすることで、Net::HTTPではなく、単にHTTPとしてだけでアクセスできるようになる。

そしてそのスコープは、WebSiteDisplayerのみになり、他のオブジェクトには影響しない。

まとめ

“Rubyのincludeとextendの賢い使い方” への1件のコメント

  1. […] Rubyのincludeとextendの賢い使い方 | もっとクールにプログラミング […]

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=107