簡體   English   中英

alias_method_chain是alias_method的同義詞嗎?

[英]Is alias_method_chain synonymous with alias_method?

如果這兩種方法只是同義詞,為什么人們會去編寫附加字符“ _chain ”呢?

編號alias_method是Ruby的標准方法。 alias_method_chain是一個Rails附加組件,旨在簡化將舊方法別名化為新名稱的常見操作,然后將新方法別名化為原始名稱。 因此,如果您正在使用新功能new_feature創建method方法的新版本,則以下兩個代碼示例是等效的:

alias_method :method_without_new_feature, :method
alias_method :method, :method_with_new_feature

alias_method_chain :method, :new_feature

編輯

這是一個假設的例子:假設我們有一個帶有方法rename的Person類。 它只需要像“John Doe”這樣的字符串,在空格上分割,並將部分分配給first_name和last_name。 例如:

person.rename("Steve Jones")
person.first_name  #=> Steve
person.last_name   #=> Jones

現在我們遇到了問題。 我們不斷獲得沒有正確大寫的新名稱。 所以我們可以編寫一個新方法rename_with_capitalization並使用alias_method_chain來解決這個問題:

class Person
  def rename_with_capitalization(name)
    rename_without_capitalization(name)
    self.first_name[0,1] = self.first_name[0,1].upcase
    self.last_name[0,1] = self.last_name[0,1].upcase
  end

  alias_method_chain :rename, :capitalization
end

現在,舊的rename稱為rename_without_capitalizationrename_with_capitalizationrename 例如:

person.rename("bob smith")
person.first_name  #=> Bob
person.last_name   #=> Smith

person.rename_without_capitalization("tom johnson")
person.first_name  #=> tom
person.last_name   #=> johnson

alias_method_chain是進行方法調用攔截的最糟糕方式。 如果您正在尋找類似的技術,請不要在軌道外使用它。

暫無
暫無

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

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