iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
自我挑戰組

rails 學習紀錄系列 第 7

[Day7]關於模組(Module)

  • 分享至 

  • xImage
  •  

模組(module),是一個很容易跟類別(class)搞混的名稱!

觀念
可以把模組想成是包含許多方法和常數的工具箱。模組其實和類別的概念很相似,但模組不能建構實例(instance),而且也不會有子類別(subclass),它只是用來儲存東西的。
可以選擇性的引用Module內的方法,不會讓Module內的變數或是Method與其他Class互相影響


模組與類別的關係

Class.superclass
=> Module

類別是模組的小孩,模組能做的類別都能做。
根據繼承概念,類別比模組還擴充了哪些方法呢?

 Class.instance_methods - Module.instance_methods
=> [:new, :allocate, :superclass]
  1. 模組不可以做出實體物件,所以不能使用.allocate[註1]與.new。
  2. 模組之間也不能被繼承,所有的模組之間都是獨立的,不能建立子類別!

[註1].allocate是什麼?
看個例子理解一下:

class Test
  def initialize(test=5566)
    @test = test
  end
end

aaa = Test.new
=> #<Test:0x007fc9228e1ff0 @test=5566>

bbb = Test.allocate
=> #<Test:0x007fc923c928d8>

當我們幫Test類別建造實體物件時...

  1. 使用.new,會分配空間給新物件,並調用類別中的initialize方法。
  2. 使用.allocate,會分配空間給新物件,但不會調用initialize方法。

如何引用模組

  • 引用模組到類別中
    1. include。include是讓class所產生的instance直接使用module裡的method
    module Log 
      def class_type
        "This class is of type: #{self.class}"
      end
    end

    class TestClass 
      include Log 
    end

    tc = TestClass.new.class_type
    puts tc #This class is of type: TestClass
  1. extend。透過 extend 則是可以把 module 中的方法在class中被使用,但不會給instance
     module Log 
      def class_type
       "This class is of type: #{self.class}"
      end
     end

   class TestClass 
     include Log 
   end

   tc = TestClass.new.class_type
   puts tc #This class is of type: TestClass

什麼時候要用繼承還是要用模組?
如果你發現你要做的這個功能,它可能在很多不同體系的類別裡都會用得到,那你可以考慮把功能寫在模組裡,需要的時候再 include 進來即可。但如果你還是不知道到底類別跟模組有什麼差別。


參考資料
為你自己學Ruby on Rails
[Ruby]include v.s extend以及require的差別
Ruby女孩:10萬.times { puts "為什麼?" }


上一篇
[Day6]關於Ruby 物件與類別(Class)的關係
下一篇
[Day8] 類別中的方法(methods in class)
系列文
rails 學習紀錄14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言