如何影响Ruby代码的加载顺序?
假设您的同事monkeypatches了Fixnum类,并重新定义了+方法来进行减法而不是加法:如何影响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, :+
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
% 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。那样的话,我就可以拿到原件了。但我们并不总能控制我们的同事做什么,是吗?比如说,有时候他们碰巧在政治上更有影响力,更霸道。