Ruby 的 prepend 和 prepened
本章節(jié)我們將講解最后一種混入方式:prepend
。
1. prepend
prepend
是在 Ruby2.0 以后引入進(jìn)來(lái)的,它的使用方式和include
非常類似,將模塊中定義的方法添加進(jìn)被添加的類的實(shí)例方法中。
實(shí)例:
module Person
def name
"My name is Andrew"
end
end
class Member
prepend Person
end
puts Member.new.name
# ---- 輸出結(jié)果 ----
My name is Andrew
2. prepend 和 include 的區(qū)別
使用include
或者extend
引入的方法如果和被引入的模塊/類中的方法重名,將不會(huì)覆蓋被引入模塊的方法,但是prepend
會(huì)覆蓋被引入模塊的方法。
下面是 include
的例子。
實(shí)例:
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
# ---- 輸出結(jié)果 ----
My name is Andrew
而 prepend
則是這個(gè)樣子。
實(shí)例:
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
# ---- 輸出結(jié)果 ----
My name is Person
我們會(huì)發(fā)現(xiàn),原本的 name
實(shí)例方法被覆蓋了。
3. prepended
當(dāng)類追加模塊后,會(huì)觸發(fā)prepended
鉤子方法。
實(shí)例:
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
# ---- 輸出結(jié)果 ----
Person prepended to Member
My name is Andrew
解釋:當(dāng)模塊Person
被追加后,觸發(fā)了prepended
鉤子方法,打印了“Person prepended to Member”。
4. 小結(jié)
本章節(jié)我們學(xué)習(xí)了prepend
,它和include
很像,都可以向類追加實(shí)例方法,不同的是,prepend
追加的方法的名稱和類本身?yè)碛械南嗤瑫r(shí),prepend
會(huì)覆蓋原有的方法,include
則不會(huì)覆蓋。另外,當(dāng)一個(gè)模塊被prepend
的時(shí)候,會(huì)觸發(fā)prepended
回調(diào),并返回操作的類名。