類的補丁
本章節(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é)我們學習了如何給類打補丁,猴子補丁是什么。