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使用絕對路徑,這樣可以完全繞過加載路徑;
不含病毒。www.avast.com |
留言列表