第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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),并返回操作的類名。