ruby-refinement
Table of Contents
今天整理收集的文章時看到了這篇 Ruby Best Practices and Tips by Toptal Developers
發現裡面的範例有到用 refinement
雖然之前知道有這個語法,但看了範例才知道該怎麼用
當想要為已存在的類別新增或覆寫方法時
常常會用 monkey patch 的方式
但這樣該類別在執行環境中就整個就被改掉了
monkey patch 若沒有規範好,會難以追蹤除錯
為了將在 String
擴充的方法限制在 MyLogClass
scope 中
範例使用了 refinement
在 MyLogClass
scope 裡面,
String才有
red跟
green` 方法可以使用
以外的 scope 中,String
還是原來沒有被改過的類別
這樣就可以控制擴充功能會出現的地方
module ConsoleColorsStringRefinement
refine String do
def red
"\e[31m#{self}\e[0m"
end
def green
"\e[32m#{self}\e[0m"
end
end
end
class MyLogClass
using ConsoleColorsStringRefinement
def log(message, level)
puts "%s: %s" % [level.to_s.red, message.to_s.green]
end
end
MyLogClass.new.log('My Message', 'DEBUG')
# DEBUG: My Message
'My Message'.to_s.red
# NoMethodError: undefined method `red' for "My Message":String