Ruby 的 prepend 和 prepened
本章節我們將講解最后一種混入方式:prepend
。
1. prepend
prepend
是在 Ruby2.0 以后引入進來的,它的使用方式和include
非常類似,將模塊中定義的方法添加進被添加的類的實例方法中。
實例:
module Person
def name
"My name is Andrew"
end
end
class Member
prepend Person
end
puts Member.new.name
# ---- 輸出結果 ----
My name is Andrew
2. prepend 和 include 的區別
使用include
或者extend
引入的方法如果和被引入的模塊/類中的方法重名,將不會覆蓋被引入模塊的方法,但是prepend
會覆蓋被引入模塊的方法。
下面是 include
的例子。
實例:
module Person
def name
"My name is Person"
end
end
class Member
include Person
def name
"My name is Andrew"
end
end
puts Member.new.name
# ---- 輸出結果 ----
My name is Andrew
而 prepend
則是這個樣子。
實例:
module Person
def name
"My name is Person"
end
end
class Member
prepend Person
def name
"My name is Andrew"
end
end
puts Member.new.name
# ---- 輸出結果 ----
My name is Person
我們會發現,原本的 name
實例方法被覆蓋了。
3. prepended
當類追加模塊后,會觸發prepended
鉤子方法。
實例:
module Person
def self.prepended(klass)
puts "#{self} prepended to #{klass}"
end
def name
"My name is Andrew"
end
end
class Member
prepend Person
end
puts Member.new.name
# ---- 輸出結果 ----
Person prepended to Member
My name is Andrew
解釋:當模塊Person
被追加后,觸發了prepended
鉤子方法,打印了“Person prepended to Member”。
4. 小結
本章節我們學習了prepend
,它和include
很像,都可以向類追加實例方法,不同的是,prepend
追加的方法的名稱和類本身擁有的相同時,prepend
會覆蓋原有的方法,include
則不會覆蓋。另外,當一個模塊被prepend
的時候,會觸發prepended
回調,并返回操作的類名。