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