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



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

还要注意,修改在多个线程中使用的类容易出现争用情况。如果您试图禁止libs使用别名,那么如果您在别名存在的情况下调用这些libs的方法,就无法阻止这种情况。我们可能会在ruby 2.0中找到一种实现这一点的方法:http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/

如果你能说出为什么要删除别名,那将是很有帮助的。如果方法名称以前不存在,那么其他库就不应该受到monkey补丁的影响。此外,您应该考虑子类化String(或委派给字符串实例),而不是修补String

def hello
   puts "Hello World"
end
alias :hi :hello
hi #=> "Hello World"
undef hi
hi #=> NameError
hello #=> "Hello World"

EDIT:请注意,这只适用于在main对象上创建的方法。为了在类上实现这一点,您需要执行类似Hello.class_eval("undef hi") 的操作

然而,从元编程的角度来看,在处理类时,我喜欢使用remove_method :hi,因为它会导致方法查找失败,并从父类中获取方法。

class Nums < Array
   def include?
      puts "Just Kidding"
   end
end
n = Nums.new
n << 4 #=> [4]
n.include? #=> "Just kidding"
Nums.class_eval("remove_method :include?")
n.include? 4 #=> true
Number.class_eval("undef include?")
n.include? 4 #=> NoMethodError

remove_method对元友好得多。

相关内容

  • 没有找到相关文章

最新更新