2012.02.21
yna 開発

rubyの話(1)

 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

一覧に戻る