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

如何影响Ruby代码的加载顺序?,ruby,monkeypatching,Ruby,Monkeypatching,假设您的同事monkeypatches了Fixnum类,并重新定义了+方法来进行减法而不是加法: class Fixnum def +(x) self - x end end >> 5 + 3 => 2 您的问题是希望访问+方法的原始功能。因此,您将此代码放在同一源文件中的his之前。在monkeypatches之前,它将+方法别名为“original_plus” class Fixnum alias_method :original_plus, :+

假设您的同事monkeypatches了Fixnum类,并重新定义了+方法来进行减法而不是加法:

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

>> 5 + 3
=> 2
您的问题是希望访问+方法的原始功能。因此,您将此代码放在同一源文件中的his之前。在monkeypatches之前,它将+方法别名为“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
但我需要知道的是:

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

我的问题有两个原因:

  • 我可能不想让他知道是我干的
  • 如果更改源文件,使别名位于monkeypatch下方,则别名将不再产生所需的结果

  • 当然。在你需要他的源文件之前,只需在你的代码中加入反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
    

    当然。在你需要他的源文件之前,只需在你的代码中加入反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
    

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

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


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

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

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


    如果像在你的例子中,他确实重新定义了一个现有的方法,只是为了改变它的行为,你应该和他谈谈,建议他使用
    alias\u method\u chain
    ,以保存现有的行为。

    哦,天哪,仅仅看到这个猴子补丁就让我畏缩。@Ólafur-我同意。尽管monkeypatching具有强大的功能,但它确实为许多灾难性的副作用提供了可能性。你得问问它是否真的值得。哦,天哪,看着这只猴子的补丁让我感到害怕。@Ólafur-我同意。尽管monkeypatching具有强大的功能,但它确实为许多灾难性的副作用提供了可能性。你得问问这是否真的值得,我对此并不熟悉。这是Rails方法吗?(我这里只关心Ruby。)alias_method_chain似乎是alias_method的同义词(据我所知)。因此,从这个意义上说,是的,我同意你的看法,他应该把+方法放在一边,而把它别名为coworker_plus。那样的话,我就可以拿到原件了。但我们并不总能控制我们的同事做什么,是吗?比如说,有时候他们碰巧在政治上更有影响力,更霸道,对此并不熟悉。这是Rails方法吗?(我这里只关心Ruby。)alias_method_chain似乎是alias_method的同义词(据我所知)。因此,从这个意义上说,是的,我同意你的看法,他应该把+方法放在一边,而把它别名为coworker_plus。那样的话,我就可以拿到原件了。但我们并不总能控制我们的同事做什么,是吗?比如说,有时候他们碰巧在政治上更有影响力,更霸道。