模塊
模塊是什麼
ruby同JAVA一樣只支持單繼承,每個類只能有一個父類,爲了提高程序的靈活性ruby引入了 模塊 爲實現多重繼承提供了可能。模塊可以說是類的一個補充,但是模塊於類有兩個不同:
- 模塊不能擁有實例
- 模塊不能被繼承
如何創建模塊
關鍵字:module
語法規則:
module 模塊名
模塊的定義
end
注意:
模塊名必須是大寫字母開頭
模塊的作用
提供命名空間(解決重名問題)
這個個人理解類似JAVA的包,用於對方法,常量,類等名稱進行區分及管理。模塊提供獨立的命名空間,例如模塊A中的say_hello方法和模塊B中的say_hello方法是屬於不同的方法。
例子:
module HelloModule
# 定義常量
Version = 'v1.0'
# 定義方法
def say_hello(name)
puts "hello,#{name}"
end
# 指定say_hello 方法爲模塊函數
module_function :say_hello
end
註釋:
module_function: 的作用是把方法作爲模塊函數公開給外部使用,module_function後面跟的參數是方法名。
利用Mix-in擴展功能(解決ruby單繼承)
什麼是Mix-in?
Mix-in 就是將模塊混合到類中。在定義類時使用include,從而在類中可以使用模塊裏的常量、方法等
例子1:使用關鍵字 include 使類包含模塊
代碼:
module Mod
def meth
puts "這是module"
end
end
class ModuleDemo01
include Mod
end
mod = ModuleDemo01.new
mod.meth
輸出:
這是module
如果想校驗類是否包含某個模塊可以用如下方式:
類名.include?(模塊名) 返回true or false.
使用Mix-in 時方法的查找順序
1)同繼承關係一樣,類自身已經定義了同名方法時,優先使用類自身的方法。
例子:
module Mod
def meth
puts "這是module"
end
end
class ModuleDemo01
include Mod
def meth
puts "這個是類的方法"
end
end
mod = ModuleDemo01.new
mod.meth
輸出:
這個是類的方法
2)一個類中包含多個模塊,優先使用最後一個包含的模塊
例子:
module Mod1
def meth
puts "這是Mod1"
end
end
module Mod2
def meth
puts "這是Mod2"
end
end
class ModuleDemo01
include Mod1
include Mod2
end
mod = ModuleDemo01.new
mod.meth
輸出:
這是Mod2
3)多級嵌套include時,查找順序也是線性的。
例子:
module Mod1
def meth
puts "這是Mod1"
end
end
module Mod2
def meth
puts "這是Mod2"
end
end
module Mod3
include Mod2
end
class ModuleDemo01
include Mod1
include Mod3
end
mod = ModuleDemo01.new
mod.meth
p ModuleDemo01.ancestors
輸出:
這是Mod2
[ModuleDemo01, Mod3, Mod2, Mod1, Object, Kernel, BasicObject]
註釋: 通過 類名.ancetores方法可以查看該類的繼承關係和順序。
4)如果相同模塊被包含兩次以上(含兩次),則第二次後的會被忽略。
例子:
module Mod1
def meth
puts "這是Mod1"
end
end
module Mod2
def meth
puts "這是Mod2"
end
end
module Mod3
include Mod2
include Mod1
include Mod2
end
class ModuleDemo01
include Mod1
include Mod3
end
mod = ModuleDemo01.new
mod.meth
p ModuleDemo01.ancestors
輸出:
這是Mod1
[ModuleDemo01, Mod3, Mod1, Mod2, Object, Kernel, BasicObject]
通過Mix-in 解決ruby單繼承問題
其實從上面例子就可以看出,一個類可以多個include多個模塊,並擁有模塊的方法,下面這個例子可以更直接看出:
例子:
module Mod1
def meth
puts "這是Mod1"
end
end
module Mod2
def meth
puts "這是Mod2"
end
end
module Mod3
include Mod2
include Mod1
def meth3
puts "這個Mod3的meth3"
end
end
class ModuleDemo01
include Mod1
include Mod3
end
mod = ModuleDemo01.new
mod.meth
mod.meth3
輸出:
這是Mod1
這個Mod3的meth3
參考來源:《ruby基礎教程》