在 Ruby 定義模組,使用的是 module 這個關鍵字

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

注意:常數不等於類別,但類別會是一個常數/Module也會是常數

  • 寫起來的手感跟類別一樣,連模組名字的規定也跟類別一樣,必須是常數(也就是首字大寫英文字母)。
  • 模組定義好了之後,如果要把它拿來用,使用 include 這個方法引入。
module Flyable
  def fly
    puts "I can Fly!"
  end

  class Cat
    include Flyable         # 使用include方法kitty就有飛行能力了!
  end

  kitty = Cat.new
  kitty.fly
end

=> I can Fly!
  • 同樣地,如果小狗類別也想要有飛行功能的話 …
module Flyable
  def fly
    puts "I can fly!"
  end
end

class Cat
  include Flyable
end

class Dog
  include Flyable         #同樣使用include讓lucky也可以飛!
end

kitty = Cat.new
kitty.fly
lucky = Dog.new
lucky.fly

=> I can fly!
=> I can fly!

模組與類別的差異

  • 在 Ruby 裡,「類別」的上層類別就是「模組」

  • 模組沒有繼承的功能

  • 模組不能實體化

  • 使用終端機並進入irb介面測試(Interactive Ruby)


將類別與模組兩者做比較

instance_methods(實體方法)

這裡發現Class比Module多了上面這三種方法

allocate 跟 new 與產生實體(instance)有關,superclass 跟繼承有關

也就是說Class多了產生實體與繼承的功能

類別or模組

  • 基本上,如果你發現你要做的這個功能,它可能在很多不同體系的類別裡都會用得到,那你可以考慮把功能包在模組裡,然後在必要的時候再 include 進來即可。

當一個receiver收到一個receive

  • Cat.eat = Cat收到一個eat方法,會往他的父層class找有沒有這個方法,若無就一路往上找,找到最上層都沒有,就回傳錯誤訊息。

  • Module則是一個加掛功能的概念。在尋找方法的過程中,也會一併尋找有無對應的Module可以使用。


引入模組的方式

include:引入

  • 可以幫類別增加實體方法

這裡的fly方法作用在kitty實體上,便是實體方法


extend:擴充

  • 可以幫類別擴充類別方法

這裡的fly方法作用在Cat類別上,便是類別方法

namespace

  • 將相同的類別做區隔


ruby世界裡的冒號

參考資料: https://railsbook.tw/chapters/08-ruby-basic-4.html