Является ли alias_method_chain синонимом alias_method? - PullRequest
22 голосов
/ 23 июня 2009

Если эти два метода являются просто синонимами, почему люди пытаются написать дополнительные символы "_chain"?

Ответы [ 2 ]

56 голосов
/ 23 июня 2009

Нет. alias_method - это стандартный метод от Ruby. alias_method_chain - это дополнение к Rails, разработанное для упрощения общего действия по наложению старого метода на новое имя, а затем на новый метод к исходному имени. Так, если, например, вы создаете новую версию метода method с новой функцией new_feature, следующие два примера кода эквивалентны:

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

и

alias_method_chain :method, :new_feature

EDIT

Вот гипотетический пример: предположим, у нас был класс Person с методом rename. Все, что он делает, это берет строку типа «Джон Доу», разделяет ее на части и присваивает части 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_capitalization, а rename_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
5 голосов
/ 24 июня 2009

alias_method_chain - худший способ перехвата вызова метода. Если вы ищете похожие методы, не используйте их вне рельсов.

...