簡體   English   中英

我可以刪除Ruby中的方法別名嗎?

[英]Can I remove a method alias in 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/

如果您可以說出要刪除別名的原因,將會很有幫助。 如果以前沒有方法名稱,那么猴子補丁不會影響其他庫。 此外,您應該考慮繼承String (或委托給字符串實例)而不是修補String

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更加友好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM