Module:
模組的定義和類比較相似,使用module關鍵字。但模組不能被執行個體化,也不能被子類化,模組是獨立的,且一個模組對像是Module類的一個執行個體。模組最常用的兩個用途是作為命空間和混入(mixin)。
在模組中,可以定義執行個體變數、執行個體方法、類變數、類方法和屬性等,並且在模組中還可能以定義類和模組。在類中也可以定義模組。
在訪問模組中的執行個體成員,需要在類中飽含模組,然後執行個體化類以訪問模組的執行個體成員。
module FirstModule
def go
puts "Go home"
end
def self.show #or FirstModule.show
puts "It's a red car."
end
end
FirstModule.show #It's a red car.
class Car
include FirstModule #在類中插入
end
car = Car.new
car.go #Go home
a)模組內方法調用:
module Test
def self.function
puts “ this is function test”
end
end
調用:Test.function
module Test2
class TestClass
def performance
puts “this is performance test”
end
end
end
調用:Test2::TestClass.new.performance
b)模組常量調用
module TestConst
PI = 3.14
end
調用:TestConst::PI
c) 模組用於命令空間(Namespace):防止命令衝突,這個就不多說了。
d) 模組用於混入(Mixins):
目的是實現多繼承在類中混入模組和從基類繼承非常相似,為的執行個體對像都可以調用執行個體成員,上面也提到了。在類中可以包含多個模組,但是類卻不能繼承自多個類。當需要給類的執行個體添加很多附加功能,且不想把這些功能全部放在基類中時,就可以使用模組來組織代碼。
e) 載入和請求模組
i. 有時會把不同的類或模組存放在不同的檔案中,在使用這些檔案時,就需要使用load和require來載入這些檔案。在使用檔案中的模組和對象時,還需要使用include和extend方法。
ii. require 和 load的區別:
- load方法參數要求是包括副檔名的完整檔案名稱,require則只需要傳入庫的名字,不需要像檔案名稱那樣的尾碼;
- load把一個檔案載入多次,而require則最多隻能載入一次;
- require方法不公可以載入ruby源檔案,還可以載入其它語言編寫的源檔案;load方法的作用就是複製和粘貼;
iii. include方法:
該方法主要用來將一個模組插入(混入)到一個類或者其它模組。在類定義中引入模組,使模組中的方法成為類的執行個體方法;這個模組的方法在引入它的類或模組中以函數的形式調用,include 並非將模組的執行個體方法簡單 拷貝到類中, 而是建立了一個類到模組的引用。,如;
模組,檔案名稱為:TestModule
module Foo
def hello
puts "This is my first module in Ruby!"
end
end
另有一個類檔案名稱為:Test #Test類和TestModule模組在同一路徑下
#require "D:/cucumber/Ruby/Module" #(負載檔案)絕對路徑
require “../Ruby/Module" #(負載檔案)相對路徑
class TestOne
include Foo #混入模組
def hi
puts "This is a class"
end
end
a=TestOne.new
a.hi
a.hello
iv. extend方法:
extend 用來在一個對象(object,或者說是instance)中引入一個模組,這類從而也具備了這個模組的方法,如:
module FirstModule
def helloMod
puts "This is a module."
end
end
class FirstClass
def helloClass
puts "This is a class."
end
end
c=FirstClass.new
c.helloClass #This is a class.
c.extend(FirstModule)
c.helloMod #This is a module.
v. 載入路徑:
Ruby的載入路徑是一個數組,可以使用全域變數$LOAD_PATH 或 $:進行訪問。數組的每個元素都是一個目錄史,ruby在這些目錄中尋找載入的檔案,前面的目錄比後面的目錄優選被尋找;可以使用 puts $: 輸出路徑;Ruby程式也可以通過修改$LOAD_PATH($:)數組的內容來修改載入路徑;如:
puts $:
$: << "../.." #修改載入路徑的值
puts"@@@@@@@"
puts $:
當然,我們可以對load或require使用絕對路徑,這樣可以完全繞過載入路徑;