我正在研究一个内部的Ruby DSL,并让它看起来尽可能漂亮,我需要修补Symbol类并添加一些运算符。我想对我如何做到这一点负责,并希望将补丁的范围和生命周期限制在特定的代码块中。这样做有标准模式吗?这里有一些伪代码来显示我在想什么:
class SomeContext
def self.monkey_patch_region(&block)
context = SomeContext.new
context.monkey_patch_Symbol
context.instance_eval(&block)
context.unmonkey_patch_Symbol
end
# magical method
def monkey_patch_Symbol
#...
end
# another magical method
def unmonkey_patch_Symbol
#...
end
端
答案 0 :(得分:5)
我相信,你正在寻找红宝石refinements。该功能已落在红宝石行李箱中,但可能会在2.0之前恢复。
答案 1 :(得分:1)
我听说过mixology gem。它被设计为mixin和unmix模块。也许它可能对猴子和unmonkey补丁很有用。
UPDATE: mixology对你没有帮助,因为它(un)将模块混合到对象(与extend
一样),而不是混合到类(与include
一样) ,你想要猴子/ unmonkey核心类,而不是他们的对象。无论如何,我打算保留这个答案作为其他人可能有用的参考。