經過了這幾天,我們已經把 class 分享得差不多了,現在要講繼承鍊的另一個主角 module
,這在實作上會比較常使用。
現在我們知道如果你想要別人的方法,你可以透過繼承的關係得到,繼承類別用 <
這個符號,雖然在 Ruby 裡,你的確可以實現因為想要頭上有角而去繼承獨角獸類別:
class Unicorn
def cone
puts " I'm a unicorn! "
end
end
class Someone < Unicorn; end
girl_friend = Someone.new
girl_friend.cone # 印出 I'm a unicorn!
當一個 class 使用
include
引入 module 的時候,會將 module 內的 method 增加為自己的實體方法:
我這有個方法,也許一樣荒誕,不過這可是貨真價實的可行方法,在這之前我們先放段影片輔助說明:
我們另外寫一個類別,當然這裡的冰淇淋一定要是一個有 甜筒餅乾
的方法,然後我們就可以 Do Re Mi So ~
module IceCream
def cone
puts " Everyone can be a unicorn! "
end
end
class Someone
include IceCream
end
girl_friend = Someone.new
girl_friend.cone # 印出 Everyone can be a unicorn!
extend
則是會將module
引入到 class 的singleton class
上方。
也就是說 module 的方法會變成類別方法。
module IceCream
def cone
puts " Everyone can be a unicorn! "
end
end
class Someone
extend IceCream
end
module 跟 class 最大的差別,就是:
而我們最前面有提到,模組在實作上較常使用,如果你發現要做的功能在很多不同體系的類別裡都會用到時,就可以考慮把功能寫在模組裡,需要的時候再 include 進來就好。
你會發現寫起來的手感可以說是一樣的,你只需記得, include
是給實體用的方法, extend
則是給類別用的,如果遇到同名的類別呢?
在模組裡以巢狀結構程式碼建立命名空間。
namespace
是限定常數能夠唯一的方式,在大多數基本層級的 namespace 能讓你建立新的範圍。允許你在那個範圍裡定義常數,不然就會與其他的衝突。由於類別和模組名稱都是常數,因此 namespace 也能用來隔離他們。 -- Effective Ruby
module Unicorn
class Cone
end
end
module IceCream
class Cone
end
end
princess_celestia = Unicorn::Cone.new
girl_friend = IceCream::Cone.new
引用 namespace 製作的新類別,記得模組名稱 + 路徑分隔符號 ::
由兩個冒號組成。
此文同步刊登於CJ-Han的網站