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

類的補丁

本章節(jié)中會為大家介紹如何為類打一個補丁,拓展類的方法以及了解“猴子補丁“,如何避免“猴子補丁”。

1. 為類打一個補丁

我們通過之前的學習了解了,如何去定義一個類。

class C
  puts "Hello"
end

# ---- 輸出結果 ----
Hello

Ruby 中類定義的語句和其他語句本質(zhì)是一樣的,我們現(xiàn)在使用 3.times 來迭代定義類 C。

3.times do
  class C
    puts "Hello"
  end
end

# ---- 輸出結果 ----
Hello
Hello
Hello

這并不意味著我們可以定義三個同樣名字為 C 的類,類只有第一次被創(chuàng)建,之后我們只是打開了這個類,并追加了一些內(nèi)容給這個類。

class D
  def x 
    'x'
  end
end

class D
  def y
    'y'
  end
end

obj = D.new
puts obj.x
puts obj.y

# ---- 輸出結果 ----
x
y

解釋:當?shù)谝淮翁峒?code>class D的時候,我們還沒有類 D,所以我們定義了類 D,并增加了一個x方法。當?shù)诙翁峒?code>class D的時候,我們已經(jīng)創(chuàng)建了類 D,就不會再次定義了,只是重新打開這個類 D,并給它定義了y方法。

Tips:您甚至可以修改 Array 和 String 這些類,為這些類增加補丁。

2. 猴子補丁

如果您為某一個類添加了一個新功能,導致這個類本身的功能受到影響,那么這個導致 bug 的補丁被稱為猴子補丁Monkeypatch)。

我們都知道,Integer 擁有一個實例方法名叫 to_s,它可以將整型對象變?yōu)樽址畬ο蟆?/p>

實例:

1.to_s 

# ---- 輸出結果 ----
'1'

若是我們給它打一個猴子補丁,那它原有的方法就會失效。

實例:

class Integer 
  def to_s
    self # 返回本身
  end
end

1.to_s 

# ---- 輸出結果 ----
1

解釋:因為Integer已經(jīng)存在了to_s的方法,我們新定義的to_s方法會覆蓋原有的方法。

注意事項:誤用了猴子布丁會導致異常的發(fā)生,但是有時候,我們希望改造已有類庫的時候,會有意去使用它。因為它涉及到全局性的修改,而且一單出現(xiàn)問題很難追蹤。所以在為某個類的時候需要檢查這個類是否有同名的方法,如果需要增加補丁,一定優(yōu)先創(chuàng)建一個新方法。

3. 小結

本章節(jié)我們學習了如何給類打補丁,猴子補丁是什么。