1

假设您的同事猴子修补了 Fixnum 类并重新定义了 + 方法以减去而不是添加:

class Fixnum
  def +(x)
    self - x
  end
end

>> 5 + 3
=> 2

您的问题是您想访问 + 方法的原始功能。所以你把这段代码放在他之前的同一个源文件中。在他对其进行猴子补丁之前,它会将+ 方法别名为“original_plus” 。

class Fixnum
  alias_method :original_plus, :+
end

class Fixnum
  def +(x)
    self - x
  end
end

现在您可以通过 original_plus 访问 + 方法的原始功能

>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8

但我需要知道的是:

除了将其粘贴到他修改的同一源文件中之外,还有其他方法可以在加载他的猴子补丁之前加载此别名吗?

我的问题有两个原因:

  1. 我可能不想让他知道我已经这样做了
  2. 如果源文件被更改,使得别名最终低于猴子补丁,则别名将不再产生所需的结果。
4

2 回答 2

6

当然。在你需要他的源文件之前,只需在你的代码中粘贴 anti-monkeypatch 。

 % cat monkeypatch.rb
 class Fixnum
   def +(x)
     self - x
   end
 end
 % cat mycode.rb
 class Fixnum
   alias_method :original_plus, :+
 end
 require 'monkeypatch'
 puts 5 + 3 #=> 2
 puts 5.original_plus(3) #=> 8
于 2009-05-16T17:05:00.480 回答
2

Monkeypatching 可以很好地扩展现有类并添加新功能。Monkeypatching 改变现有功能的行为简直太疯狂了!

说真的,你应该和你的同事谈谈。

如果像在您的示例中那样,他确实重新定义了现有方法只是为了改变其行为,您应该与他交谈并建议他使用alias_method_chain以保存现有行为。

于 2009-05-16T17:16:24.633 回答