Ruby 的 prepend 和 prepened
本章節(jié)我們將講解最后一種混入方式: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
# ---- 輸出結(jié)果 ----
My name is Andrew
2. prepend 和 include 的區(qū)別
使用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
# ---- 輸出結(jié)果 ----
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
# ---- 輸出結(jié)果 ----
My name is Person
我們會發(fā)現(xiàn),原本的 name 實例方法被覆蓋了。
3. prepended
當類追加模塊后,會觸發(fā)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
# ---- 輸出結(jié)果 ----
Person prepended to Member
My name is Andrew
解釋:當模塊Person被追加后,觸發(fā)了prepended鉤子方法,打印了“Person prepended to Member”。
4. 小結(jié)
本章節(jié)我們學習了prepend,它和include很像,都可以向類追加實例方法,不同的是,prepend追加的方法的名稱和類本身擁有的相同時,prepend會覆蓋原有的方法,include則不會覆蓋。另外,當一個模塊被prepend的時候,會觸發(fā)prepended回調(diào),并返回操作的類名。
杜驍 ·
2025 imooc.com All Rights Reserved |