iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
0
Software Development

Ruby 研究 30 天系列 第 22

Day 21 - Module 模組

  • 分享至 

  • xImage
  •  

Module

經過了這幾天,我們已經把 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!

Include

當一個 class 使用 include 引入 module 的時候,會將 module 內的 method 增加為自己的實體方法:

我這有個方法,也許一樣荒誕,不過這可是貨真價實的可行方法,在這之前我們先放段影片輔助說明:

Yes

我們另外寫一個類別,當然這裡的冰淇淋一定要是一個有 甜筒餅乾 的方法,然後我們就可以 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

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 最大的差別,就是:

  • 模組沒辦法 new 一個新的實體出來。
  • 模組沒辦法繼承別的模組。

而我們最前面有提到,模組在實作上較常使用,如果你發現要做的功能在很多不同體系的類別裡都會用到時,就可以考慮把功能寫在模組裡,需要的時候再 include 進來就好。

你會發現寫起來的手感可以說是一樣的,你只需記得, include 是給實體用的方法, extend 則是給類別用的,如果遇到同名的類別呢?

Namespace

在模組裡以巢狀結構程式碼建立命名空間。 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的網站


上一篇
Day 20 - Singleton Class 下篇
下一篇
Day 22 - 引數與參數 上篇
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言