Rubyにはモジュールという概念があります。
何に使用されるかというと、一定のコード(関数やクラス)をグループ化をして、名前空間の汚染を防ぐためにあります。規模の大きいプログラムを書く場合や、広く一般に配布されるようなプログラムを書く場合、クラス名やメソッド名、定数名が衝突する危険性があります。
moduleで全体を囲むことで、特定の機能ごとに分割して扱うことが出来るようになります。ある意味、C++やC#のnamespaceという機能に似ています。
STR_TEST = "ABC"
module MyModule
STR_TEST = "def"
class MyClass
def test
puts STR_TEST # defを表示
end
end
def self.test2
puts STR_TEST # defを表示
end
end
puts STR_TEST # ABCを表示
puts MyModule::STR_TEST # defを表示
このような使い方は、CGIモジュールとかNetモジュールなどで使われています。
もうひとつRubyでは、mixinという用途のためにモジュールが使用されます。
以下のコードのtestというメソッドは、インスタンスメソッドです。しかしモジュールでは、インスタンスを生成できませんので、このままではこのメソッドを使用することはできません。
module MyModule
def test
puts "MyModule.test"
end
end
このようなモジュールがあったとき、MyClassでMyModuleをインクルードすることで、MyModleのtestメソッドを使用することができるようになります。
class MyClass
include MyModule
end
myobj = MyClass.new
myobj.test # MyModule.testを表示
この仕組みを生かしたのがEnumerableというモジュールです。
このモジュールをインクルードするクラスにeachというメソッドがあれば、検索やgrepなどイロイロな機能を使うことが出来るようになります。
データ構造がファイルと連携しているなどの場合に、素直にArrayにすることができないことがあります。この場合、eachだけでもインプリメントすることで、全体検索に必要な機能をインプリメントすることができます。
このmixinという仕組みは、javaなどで使われるインターフェース技法を一歩進めた形といえます。
— yna 2012-02-21