22

これらの2つの方法が単に同義語である場合、なぜ人々は追加の文字「_chain」を書くのに苦労するのでしょうか。

4

2 に答える 2

57

いいえ alias_method。はRubyの標準的な方法です。 alias_method_chainは、古いメソッドを新しい名前にエイリアスし、次に新しいメソッドを元の名前にエイリアスするという一般的なアクションを簡素化するように設計されたRailsアドオンです。したがって、たとえばmethod、新しい機能を使用してメソッドの新しいバージョンを作成する場合new_feature、次の2つのコード例は同等です。

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

alias_method_chain :method, :new_feature

編集

架空の例を次に示します。メソッドを持つPersonクラスがあるとしrenameます。「JohnDoe」のような文字列を取得し、スペースで分割して、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_capitalizationですrename。例えば:

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
于 2009-06-23T19:32:00.540 に答える
5

alias_method_chainメソッド呼び出しの傍受を行う最悪の方法です。同様の手法を探している場合は、レールの外で使用しないでください。

于 2009-06-24T03:33:22.237 に答える