两用模块(改进或全局补丁)
使用 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