ruby - 我可以删除 Ruby 中的方法别名吗?

标签 ruby metaprogramming alias-method

假设我有一段 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/

相关文章:

ruby - 类方法是否有 alias_method ?

ruby - 包含模块时 __callee__ 的意外值——这是 Ruby 错误吗?

ruby-on-rails - alias_method 和 alias_method_chain 有什么区别?

ruby-on-rails - Rails 3 如何允许在没有_attributes 指定的情况下传递嵌套属性

java - JRuby GUI 窗口

ruby - 使用正则表达式对散列进行行拆分

ruby - 什么时候用undef_method,什么时候用remove_method?

ruby-on-rails - 如何从头开始我的 Ruby 环境?

c++ - 可变参数(包大小为 N)和默认参数

c++ - 程序员需要 C++ 元模板知识吗?