Rubyでは一般的なオブジェクト指向言語の多くに用意されているクラスの継承の他に、モジュールという機能があります。モジュールはインスタンスを持たずinclude文により取りこんで使用します。

モジュールは「クラスAを継承してクラスBを作った。クラスBの提供する多くの機能を持つクラスCを作りたいが、意味的にクラスCがクラスBを継承するのは不自然」というようなケースで使用すると便利です。

つまり、クラスCでも使用したいクラスBの機能をモジュールとして括りだし、クラスCからinlcudeするわけです。

このことを、Mix-inと呼びます。モジュールを使用するとクラスの継承関係を縦断した機能追加を、よりスムーズに行うことができます。

モジュールを定義する

モジュールを定義するにはmodule文を使用します。モジュール名は定数(先頭が大文字で始まる)である必要があります。

 module SampleModule
   def square(n)
     n * n
   end
 end

モジュールを使用する

include文により使用したいモジュールを取り込むことができます。

 module SampleModule
   def square(n)
     n * n
   end
 end
 
 class SampleClass
   include SampleModule
   # 略
 end
 
 o = SampleClass.new
 p o.square(3) #=> 9

特定オブジェクトのみモジュールの機能を追加する

クラスではなく特定のオブジェクトにだけモジュールの機能を追加するには、extendメソッドを使用します。

 module SampleModule
   def square(n)
     n * n
   end
 end
 
 class SampleClass ;end
 
 o = SampleClass.new
 o1 = SampleClass.new
 
 o.extend SampleModule
 p o.square(3) #=> 9
 p o1.square(3) #=> NameError