Open class 開放類別是 Ruby 程式語言的特色之一,所謂的開放類別就是讓 Ruby 內部的類別可以增加,甚至是改寫原有的方法。以下面的範例來說:
class Dog
def jump
'jump'
end
end
class Dog
def run
'run'
end
end
dog = Dog.new
dog.jump # => "jump"
dob.run # => "run"
當 Ruby 第一次遇到 class Dog 時,發現 class Dog 並不存在,所以會定義此類別及 jump()方法。接者第二次再遇到 class Dog 時,會知道 class Dog 已經存在於 Ruby 了,因此會 "打開" 類別,讓 run()方法可以進入而類別 Dog 就會多了 run() 方法了。
當然你也可以改寫 Ruby 內建類別,例如:String 、Array 等…
grade = [90, 88, 4]
puts grade.size # => 3, 還未改寫內部size方法前
class Array
def size
10 # => 只要是呼叫size方法就會回傳10
end
end
p grade.size # => 10, 改寫size方法後
" The term monkey patch only refers to dynamic modifications of a class or module at runtime, motivated by the intent to patch existing third-party code as a workaround to a bug or feature which does not act as desired. " from Wikipedia
Monkey Patching >
開放類別常見的問題就是在複雜的專案中,如果沒有適當的控管,有可能會修改到相同名字方法,而造成與之前撰寫好的程式碼產生衝突。當我們只是為了要解決程式裡的某個 bug 或是新的功能,而直接去利用開放類別的便利性去做修改,就是所謂的 "猴子補丁 (monkey patching)" 。
Ruby 有提供可以檢查是否有重複使用名稱的方法
[ ].methods.grep /^re/ # => 利用 regexp 找出所有re開頭的方法名稱
更詳細的介紹可以參考:3 Ways to Monkey-Patch Without Making a Mess
Open Class 增加了在撰寫程式的靈活性,也是許多人喜愛 Ruby的特色之一。只要使用得當,會讓程式閱讀上更好,日後在維護程式也將更有效率。大家所熟悉的 Rails 也常見使用此技巧。