如何在Ruby中干净地“重新附加”一个分离的方法?

时间:2016-12-05 07:53:13

标签: ruby

说我有这个班:

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附加到类中,即不定义调用分离的方法的新方法。

注意:我对临时更改类功能的其他方法不感兴趣。我特别想知道如何用不同的方法替换方法,然后干净地恢复原始方法。

1 个答案:

答案 0 :(得分:1)

这似乎有效:

Foo.instance_exec {
  define_method(:destroy_target, backup)
}

但我不完全确定这是否是副作用。如果有人确切知道我会发表评论。

如果Foo是这样定义的模块,这似乎也有效:

module Foo
  extend self

  def destroy_target(target)
    Missile.launch(target)
  end
end