两用模块(改进或全局补丁)

使用 Refinements 对补丁进行范围化是一种很好的做法,但有时在全局加载它(例如在开发或测试中)是很好的。

比如说,你想启动一个控制台,需要你的库,然后在全局范围内使用修补的方法。你不能通过改进来做到这一点,因为需要在类/模块定义中调用 using。但是有可能以这样的方式编写代码:它具有双重目的:

module Patch
  def patched?; true; end
  refine String do
    include Patch
  end
end

# globally
String.include Patch
"".patched? # => true

# refinement
class LoadPatch
  using Patch
  "".patched? # => true
end