如何影响Ruby代码的加载顺序?

时间:2009-05-16 15:46:46

标签: ruby monkeypatching

让我们说你的同事monkeypat修复Fixnum类并重新定义+方法减去而不是添加:

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

>> 5 + 3
=> 2

您的问题是您想要访问+方法的原始功能。因此,您将此代码放入相同的源文件之前。它将+方法别名为“original_plus”,之后将其monkeypatches。

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

但我需要知道的是:

除了将monkeypatch加载到他修改过的同一个源文件中之前,是否还有其他加载此别名的方法?

我的问题有两个原因:

  1. 我可能不希望他知道我已经这样做了
  2. 如果源文件被更改,以便别名最终低于monkeypatch,则别名将不再产生所需的结果。

2 个答案:

答案 0 :(得分:6)

不确定。只需在之前将反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

答案 1 :(得分:2)

Monkeypatching很适合扩展现有类并添加新功能。 Monkeypatching改变现有功能的行为只是疯了!

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

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