What is the difference between include and extend?
include與extend的差別在哪裡?
在昨天講解了類別與模組的差異,也順便知道可以在類別裡面使用include模組的方式來擴充方法。
好像又有看過extend模組這樣的寫法,那到底有什麼不同呢?
include
是引用模組內的方法來擴充實體方法,而extend
則是擴充類別方法。
以下面的例子說明
module Piano
def play_piano
puts "I can play the piano!"
end
end
module Walkable
def walk
puts "walk!!"
end
end
class Human
include Piano
extend Walkable
end
John = Human.new
John.play_piano # => I can play the piano!
John.walk # => 噴錯
Human.walk # => walk!!
可以看到與Human
類別include
Piano
模組來增加實體方法,實體John就可以使用,而extend
Walkable
模組則是增加類別方法,實體John是不能使用extend
引進來的類別方法的,身為類別的Human
才可以。若對類別方法與實體方法有些陌生的,可以參考我的這篇文章,介紹了實體方法與類別方法的差別。
include與extend都是可以讓類別增加方法的做法,而差別在於include是增加實體方法,而是extend增加類別方法。