亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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