Ruby 模塊(Module)
模塊(Module)是一種把方法、類和常量組合在一起的方式。 模塊(Module)為您提供了兩大好處。
- 模塊提供了一個命名空間和避免名字衝突。
- 模塊實現了mixin裝置。
模塊(Module)定義了一個命名空間,相當於一個沙盒,在裡邊您的方法和常量不會與其他地方的方法常量衝突。
模塊類似與類,但有一下不同:
- 模塊不能實例化
- 模塊沒有子類
- 模塊只能被另一個模塊定義
語法
module Identifier statement1 statement2 ........... end
模塊常量命名與類常量命名類似,以大寫字母開頭。 方法定義看起來也相似:模塊方法定義與類方法定義類似。
通過類方法,您可以在類方法名稱前面放置模塊名稱和一個點號來調用模塊方法,您可以使用模塊名稱和兩個冒號來引用一個常量。
實例
#!/usr/bin/ruby # 定义在 trig.rb 文件中的模块 module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end
我們可以定義多個函數名稱相同但是功能不同的模塊:
#!/usr/bin/ruby # 定义在 moral.rb 文件中的模块 module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end
就像類方法,當您在模塊中定義一個方法時,您可以指定在模塊名稱後跟著一個點號,點號後跟著方法名。
Rubyrequire語句
require 語句類似於C 和C++ 中的include 語句以及Java 中的import 語句。 如果一個第三方的程序想要使用任何已定義的模塊,則可以簡單地使用Ruby require語句來加載模塊文件:
語法
require filename
在這裡,文件擴展名.rb不是必需的。
實例
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
在這裡,我們使用$LOAD_PATH << '.'讓Ruby知道必須在當前目錄中搜索被引用的文件。 如果您不想使用$LOAD_PATH,那麼您可以使用require_relative來從一個相對目錄引用文件。
注意:在這裡,文件包含相同的函數名稱。所以,這會在引用調用程序時導致代碼模糊,但是模塊避免了這種代碼模糊,而且我們可以使用模塊的名稱調用適當的函數。
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 $LOAD_PATH << '.' 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 中的Mixins
在閱讀本節之前,您需要初步了解面向對象的概念。
當一個類可以從多個父類繼承類的特性時,該類顯示為多重繼承。
Ruby 不直接支持多重繼承,但是Ruby 的模塊(Module)有另一個神奇的功能。 它幾乎消除了多重繼承的需要,提供了一種名為mixin的裝置。
Ruby 沒有真正實現多重繼承機制,而是採用成為mixin技術作為替代品。 將模塊include到類定義中,模塊中的方法就mix進了類中。
讓我們看看下面的示例代碼,深入了解mixin:
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 組成。
- 類Sample 包含了模塊A 和B。
- 類Sample 可以訪問所有四個方法,即a1、a2、b1 和b2。