模組(module),是一個很容易跟類別(class)搞混的名稱!
觀念
可以把模組想成是包含許多方法和常數的工具箱。模組其實和類別的概念很相似,但模組不能建構實例(instance),而且也不會有子類別(subclass),它只是用來儲存東西的。
可以選擇性的引用Module內的方法,不會讓Module內的變數或是Method與其他Class互相影響
模組與類別的關係
Class.superclass
=> Module
類別是模組的小孩,模組能做的類別都能做。
根據繼承概念,類別比模組還擴充了哪些方法呢?
Class.instance_methods - Module.instance_methods
=> [:new, :allocate, :superclass]
[註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類別建造實體物件時...
如何引用模組
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
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 "為什麼?" }