Ruby模塊相關(guān)概念解析
我們?cè)趯W(xué)習(xí)Ruby語(yǔ)言的時(shí)候,可以充分的了解到其中的含義。在這篇文章中,我們將會(huì)了解到有關(guān)Ruby模塊的相關(guān)知識(shí)接受,方便大家的理解。#t#
Ruby模塊非常類(lèi)似類(lèi),除了:
模塊不可以有實(shí)體
模塊不可以有子類(lèi)
模塊由module...end定義.
實(shí)際上...Ruby模塊的'模塊類(lèi)'是'類(lèi)的類(lèi)'這個(gè)類(lèi)的父類(lèi).搞懂了嗎?不懂?讓我們繼續(xù)看下去吧.
模塊有兩種用法.其一是將相近的方法和實(shí)體放在一個(gè)相對(duì)集中的域里.Ruby標(biāo)準(zhǔn)包里的Math模塊就扮演著這一角色:
- ruby> Math.sqrt(2)
- 1.41421
- ruby> Math::PI
- 3.14159
::操作符告訴 Ruby 解釋器在哪里找常數(shù)的值(可以想像,Math外的其它模塊用PI表示其它的一些東西).如果我們想省掉 :: 直接調(diào)用一個(gè)模塊的方法和常數(shù),我們可以用 include:
- ruby> include Math
- Object
- ruby> sqrt(2)
- 1.41421
- ruby> PI
- 3.14159
Ruby模塊的另一用法是糅和(mixin).某些OO語(yǔ)言,包括C++,允許多重繼承(multiple inheritance),即從多個(gè)的父類(lèi)里繼承. 現(xiàn)實(shí)世界里一個(gè)多重繼承的例子是鬧鐘:你可以想像鬧鐘屬于鐘類(lèi)同是屬于帶蜂音器的事物類(lèi).
Ruby并未特意實(shí)現(xiàn)真正的多重繼承,但糅和技術(shù)是一很好的替代.記得模塊無(wú)法實(shí)體化或子類(lèi)化;但如果我們?cè)陬?lèi)定義里include一個(gè)方法,
它的方法便實(shí)際上已加入,或"糅合"進(jìn)這個(gè)類(lèi).
糅合可以視為一種尋求一切我們希望得到的特定屬性的方法.舉個(gè)例子,如果一個(gè)類(lèi)有個(gè) each 方法,把標(biāo)準(zhǔn)庫(kù)里的Enumerable模塊糅合進(jìn)來(lái)就自然地賦予我們 sort 和 find 兩個(gè)方法.
Ruby模塊的使用令到我們獲得多重繼承的基本功能卻可通過(guò)簡(jiǎn)單的樹(shù)結(jié)構(gòu)表述類(lèi)關(guān)系,同時(shí)也可觀地簡(jiǎn)化了語(yǔ)言的實(shí)現(xiàn)(Java的設(shè)計(jì)者也做了一個(gè)類(lèi)似的選擇).