Ruby的模塊和類有相似之處:他們都包含一組方法、常量、以及其他類和模塊的定義。但不同的是不能創建模塊的實例。
Ruby的模塊非常類似類,除了:
- 模塊不可以有實體?
- 模塊不可以有子類?
- 模塊由module...end定義.
實際上...模塊的'模塊類'是'類的類'這個類的父類。
模塊用途有二。一是扮演著命名空間的角色,使得方法的名字不會彼此沖突;二是可以在不同的類之間共享同樣的功能。如果一個類混入(mix in)了一個模塊,這個類就將擁有模塊中定義的所有的實例方法,就像在類中定義了這些實例方法一樣。不同的類可以混入同樣的模塊,因此可以共享同樣的功能而無須使用繼承。此外也可以在一個類中混入多個模塊。
在Rails中用模塊來實現輔助方法,并自動地將輔助模塊混入到適當的視圖中。
模塊的定義格式:
module 模塊名
??? def 方法名
??? ??? ...
??? end
??? ...
end
模塊有兩種用法.其一是將相近的方法和實體放在一個相對集中的域里.Ruby標準包里的Math模塊就扮演著這一角色:
ruby>?Math.sqrt(2)
???1.41421
ruby>?Math::PI
???3.14159
::操作符告訴?Ruby?解釋器在哪里找常數的值(可以想像,Math外的其它模塊用PI表示其它的一些東西).如果我們想省掉?::?直接調用一個模塊的方法和常數,我們可以用?include:
ruby>?include?Math
???Object
ruby>?sqrt(2)
???1.41421
ruby>?PI
???3.14159
模塊的另一用法是混入(mixin).某些OO語言,包括C++,允許多重繼承(multiple?inheritance),即從多個的父類里繼承.?現實世界里一個多重繼承的例子是鬧鐘:你可以想像鬧鐘屬于鐘類同是屬于帶蜂音器的事物類.
Ruby并未特意實現真正的多重繼承,但混入技術是一很好的替代.記得模塊無法實體化或子類化;但如果我們在類定義里include一個方法,
它的方法便實際上已加入,或"混入"進這個類.
混入可以視為一種尋求一切我們希望得到的特定屬性的方法.舉個例子,如果一個類有個?each?方法,把標準庫里的Enumerable模塊糅合進來就自然地賦予我們?sort?和?find?兩個方法.
模塊的使用令到我們獲得多重繼承的基本功能卻可通過簡單的樹結構表述類關系,同時也可觀地簡化了語言的實現(Java的設計者也做了一個類似的選擇).