iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Modern Web

Ruby新手村的礦工日記系列 第 17

[ Day 17 ] Ruby 中的模組 (Module)

  • 分享至 

  • xImage
  •  

上一章介紹完類別了,今天來介紹跟他有點像的東西,模組!

現在我有一個未來人類別,而我想要這個未來人類別有飛行功能,你可能會這樣做:

  1. 建立一個機器類別並在內部寫一個飛行功能,然後在由未來人去繼承它。
  2. 直接在未來人類別定義一個飛行功能。

雖然這兩種可行,但第 1 種的設計有點奇怪,為什麼要為了有飛行功能就跑去當機器。
第 2 種好像可以,但之後又有不同類別也想要飛行功能,這樣又要在該類別寫飛行功能,飛行功能就不能共用了。

這時,模組就可以用了!

我想飛!

我們可以用 module 來建立一個模組:

module Flyable
  def fly
    puts "I can fly!"
  end
end

在命名上跟類別一樣,都是使用駝峰式命名。
但要怎麼用呢?
我們只要用 include 就行了:

class FutureMan
  include Flyable
end

man = FutureMan.new
man.fly

當我把飛型模組裝上去後,未來人就會飛了,那如果機器人也想飛的話,只要再加一行:

class Robot
  include Flyable
end

robot = Robot.new
robot.fly

這樣機器人就會飛了!

使用模組與類別的差別?

類別是繼承過來了,模組是額外裝上去的。
在 Ruby 裡,類別的上層類別就是模組
開個 irb 來看看:

$ irb
>> Class.superclass
=> Module

這邊我們透過 superclass 可以看到 Class 的上層就是 Module。
由此可知類別模組之間是繼承關係,那他們的差別:

$ irb
>> Class.instance_methods - Module.instance_methods
=> [:allocate, :superclass, :subclasses, :new]

這邊可以看到下層 Class 類別,比 Module 類別多了 4 種方法,所以它跟 Class 最大的差別:

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

那我要用模組還是繼承呢?

當你發現你要做的這個功能,它可能在很多不同類別裡都會用得到,那就可以考慮把功能寫在模組裡,需要的時候再 include 進來。

參考資料:

  1. 為你自己學 Ruby on Rails
  2. [Ruby] 物件(object)、類別(class)和模組(module)

上一篇
[ Day 16 ] Ruby 類別 (class)
下一篇
[ Day 18 ] Rails : MVC是什麼?
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言