说我有这个班:
class Foo
def destroy_target(target)
Missile.launch(target)
end
end
我想暂时中性Foo
的破坏力,例如用于测试目的,所以我这样做:
backup = Foo.instance_method(:destroy_target)
class Foo
def destroy_target(target)
Pillow.launch(target)
end
end
以下是我的问题:如何将原始方法“重新附加”到Foo
,就好像它从未被覆盖过一样?
我意识到我可以这样做:
class Foo
def destroy_target(target)
backup.bind(self).call(target)
end
end
但显然这不是最佳的,因为我现在正在包装原始功能。我希望能够无限次地分离和重新连接该方法,而不会增加任何开销。
以不同的方式问道;如何“正确”将DetachedMethod
附加到类中,即不定义调用分离的方法的新方法。
注意:我对临时更改类功能的其他方法不感兴趣。我特别想知道如何用不同的方法替换方法,然后干净地恢复原始方法。
答案 0 :(得分:1)
这似乎有效:
Foo.instance_exec {
define_method(:destroy_target, backup)
}
但我不完全确定这是否是副作用。如果有人确切知道我会发表评论。
如果Foo
是这样定义的模块,这似乎也有效:
module Foo
extend self
def destroy_target(target)
Missile.launch(target)
end
end