位置:首頁 > 腳本語言 > Ruby基礎教程 > Ruby模塊和混合類型

Ruby模塊和混合類型

模塊是組合在一起的方法,類和常量。模塊兩個主要好處:

  • 模塊提供了一個命名空間,並避免名稱衝突。

  • 模塊實現混合工廠。

模塊定義了一個命名空間,一個沙箱中方法和常量可以自由使用,而不必擔心踩到其他的方法和常數。

語法:

module Identifier
   statement1
   statement2
   ...........
end

就像被命名為類常量模塊中的常量,首字母大寫。定義的方法看起來很相似,模塊定義方法就像類的方法。

調用一個模塊方法和類方法一樣,通過模塊的名稱它名字前,引用一個常數使用該模塊的名稱和兩個冒號。

例子:

#!/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

我們可以定義一個函數名相同,但在不同的功能模塊:

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

和類的方法一樣,當在一個模塊中定義的方法,指定模塊名稱後麵跟著一個點,那麼該方法的名稱。

Ruby require 語句:

require 語句聲明的是類似於 C/C++ 的 include語句 和 Java 的 import 語句。如果有第三個程序要使用任何定義的模塊,它可以簡單地使用Ruby require 語句加載的模塊文件:

語法:

require filename

在這裡,它不是必需的  .rb 文件名擴展。

例如:

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

重要: 在這裡,這兩個文件都包含相同的函數名。因此,這將導致在代碼中的歧義,同時包括在調用程序,但的模塊避免這個代碼模糊,我們能夠調用適當的功能模塊的名稱。

Ruby include 語句:

可以嵌入在一個類模塊。要在一個類中嵌入模塊,可以使用類中 include 語句:

語法:

include modulename

如果一個模塊被定義在單獨的文件,那麼它需要包含該文件需要隱藏於公開的模塊在一個類的 require  語句之前。

例子:

考慮以下模塊寫在support.rb文件。

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

現在,可以在如下一類包括這個模塊:

#!/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

這將產生以下結果:

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Ruby中混合類型:

通過本節之前,假設有麵向對象的概念和知識。

當一個類可以從多個父類繼承的特點,類應該顯示多重繼承。

Ruby冇有直接中suppoprt多繼承,但Ruby的模塊有另一個精彩使用。他們幾乎消除多重繼承的需要,提供了一個工廠稱為混入。

混合類型給一個精彩的控製方式增加功能類。在代碼中混合類,使用它的代碼能進行進行交互。

讓我們來看看下麵的示例代碼來獲得混合類型了解:

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。類示例包括兩個模塊A和B類的樣品可以訪問所有四種方法,即a1, a2, b1 或 b2。因此,可以看到這個類繼承自兩個模塊樣品。因此,可以說類的示例顯示了多重繼承或混入。