假设我有一段Ruby代码,我想为别名一个方法(我不知道为什么,让我们假设我有一个很好的理由)。我可以在Ruby中删除方法别名吗?
class String
alias_method :contains?, :include?
end
是否有可能对我来说,这部分后,以删除此别名?
假设我有一段Ruby代码,我想为别名一个方法(我不知道为什么,让我们假设我有一个很好的理由)。我可以在Ruby中删除方法别名吗?
class String
alias_method :contains?, :include?
end
是否有可能对我来说,这部分后,以删除此别名?
def hello
puts "Hello World"
end
alias :hi :hello
hi #=> "Hello World"
undef hi
hi #=> NameError
hello #=> "Hello World"
编辑:请注意,这将只适用于在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
是更友元。
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
(或委托给字符串实例),而不是修补String
。
如果'hi'最初是继承或混合的,'remove_method'会更好。使用'undef'或'undef_method'可以防止调用沿着继承/混合链传播。 – Kelvin 2012-07-12 17:47:52
我实际上编辑了我的答案,以反映当你评论= D时的情况 – 2012-07-12 17:52:28