模塊是組合在一起的方法,類和常量。模塊兩個(gè)主要好處:
- 模塊提供了一個(gè)命名空間,并避免名稱沖突。
- 模塊實(shí)現(xiàn)混合工廠。
模塊定義了一個(gè)命名空間,一個(gè)沙箱中方法和常量可以自由使用,而不必?fù)?dān)心踩到其他的方法和常數(shù)。
語(yǔ)法:
1
2
3
4
5
|
module Identifier statement1 statement2 ........... end |
就像被命名為類常量模塊中的常量,首字母大寫。定義的方法看起來(lái)很相似,模塊定義方法就像類的方法。
調(diào)用一個(gè)模塊方法和類方法一樣,通過模塊的名稱它名字前,引用一個(gè)常數(shù)使用該模塊的名稱和兩個(gè)冒號(hào)。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/ruby # Module defined in trig.rb file module Trig PI = 3 . 141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end |
我們可以定義一個(gè)函數(shù)名相同,但在不同的功能模塊:
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/ruby # Module defined in moral.rb file module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end |
和類的方法一樣,當(dāng)在一個(gè)模塊中定義的方法,指定模塊名稱后面跟著一個(gè)點(diǎn),那么該方法的名稱。
Ruby require 語(yǔ)句:
require 語(yǔ)句聲明的是類似于 C/C++ 的 include語(yǔ)句 和 Java 的 import 語(yǔ)句。如果有第三個(gè)程序要使用任何定義的模塊,它可以簡(jiǎn)單地使用Ruby require 語(yǔ)句加載的模塊文件:
語(yǔ)法:
require filename
在這里,它不是必需的 .rb 文件名擴(kuò)展。
例如:
1
2
3
4
5
|
require 'trig.rb' require 'moral' y = Trig.sin(Trig:: PI / 4 ) wrongdoing = Moral.sin(Moral:: VERY_BAD ) |
重要: 在這里,這兩個(gè)文件都包含相同的函數(shù)名。因此,這將導(dǎo)致在代碼中的歧義,同時(shí)包括在調(diào)用程序,但的模塊避免這個(gè)代碼模糊,我們能夠調(diào)用適當(dāng)?shù)墓δ苣K的名稱。
Ruby include 語(yǔ)句:
可以嵌入在一個(gè)類模塊。要在一個(gè)類中嵌入模塊,可以使用類中 include 語(yǔ)句:
語(yǔ)法:
include modulename
如果一個(gè)模塊被定義在單獨(dú)的文件,那么它需要包含該文件需要隱藏于公開的模塊在一個(gè)類的 require 語(yǔ)句之前。
例子:
考慮以下模塊寫在support.rb文件。
1
2
3
4
5
6
7
8
9
|
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end |
現(xiàn)在,可以在如下一類包括這個(gè)模塊:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/ruby require "support" class Decade include Week no_of_yrs= 10 def no_of_months puts Week:: FIRST_DAY number= 10 * 12 puts number end end d1=Decade. new puts Week:: FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months |
這將產(chǎn)生以下結(jié)果:
1
2
3
4
5
|
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120 |
Ruby中混合類型:
通過本節(jié)之前,假設(shè)有面向?qū)ο蟮母拍詈椭R(shí)。
當(dāng)一個(gè)類可以從多個(gè)父類繼承的特點(diǎn),類應(yīng)該顯示多重繼承。
Ruby沒有直接中suppoprt多繼承,但Ruby的模塊有另一個(gè)精彩使用。他們幾乎消除多重繼承的需要,提供了一個(gè)工廠稱為混入。
混合類型給一個(gè)精彩的控制方式增加功能類。在代碼中混合類,使用它的代碼能進(jìn)行進(jìn)行交互。
讓我們來(lái)看看下面的示例代碼來(lái)獲得混合類型了解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample. new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1 |
模塊A包括一種方法,a1和a2。模塊B包括一種方法,b1和b2。類示例包括兩個(gè)模塊A和B類的樣品可以訪問所有四種方法,即a1, a2, b1 或 b2。因此,可以看到這個(gè)類繼承自兩個(gè)模塊樣品。因此,可以說(shuō)類的示例顯示了多重繼承或混入。