Bear Su's Blog

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才有redgreen` 方法可以使用

以外的 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
console

如果覺得這篇文章對您有所幫助,歡迎贊助我一杯咖啡 ☕️

祝您有美好的一天 ❤️