假设我有一段 Ruby 代码,我想在其中为一个方法设置别名(我不知道为什么;让我们假设我有一个很好的理由)。
class String
alias_method :contains?, :include?
end
我可以在本节之后删除这个别名吗?
最佳答案
remove_method
在大多数情况下应该有效。但是,如果您的 alias_method
覆盖了现有方法,您可能需要通过单独的 alias_method
调用来保存原始方法。
# assuming :contains? is already a method
alias_method :original_contains?, :contains?
alias_method :contains?, :include?
然后恢复原来的状态:
alias_method :contains?, :original_contains?
remove_method :original_contains? # optional
另请注意,修改在多线程中使用的类很容易出现竞争条件。而且,如果您试图禁止库使用别名,那么如果您在别名存在时调用这些库的方法,则无法阻止这种情况。我们可能会在 ruby 2.0 中看到这样做的方法:http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/
如果您能说明为什么要删除别名,将会很有帮助。如果该方法名称之前不存在,则您的猴子补丁不会影响其他库。此外,您应该考虑子类化 String
(或委托(delegate)给字符串实例)而不是修补 String
。
关于ruby - 我可以删除 Ruby 中的方法别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11457190/