Вопрос по ruby-on-rails, alias, ruby – Является ли alias_method_chain синонимом alias_method?

22

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

Ваш Ответ

2   ответа
5

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

Вы можете объяснить, почему? :)
Хорошо для начала:yehudakatz.com/2009/03/06/alias_method_chain-in-models
56

Нет.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
Спасибо за все детали. Теперь я понимаю, что вы имеете в виду. Единственный вопрос, который у меня возникает, - это если относительные местоположения этих определений имеют значение в файле исходного кода. Пример "Персона" не указывает, где "переименовывать"; метод определен в файле относительно "rename_with_capitalization" и "alias_method_chain: переименовать,: заглавные буквы". Это имеет значение? Кроме того, alias_method_chain всегда использует & apos; _with & apos; и «без»; определить соответствующие псевдонимы? Я полагаю, так на основании вашего объяснения. John Owens
@ Джон Оуэнс: см. Добавленный пример.
alias_method_chain принимает два аргумента, которые объединяются, чтобы создать результирующие имена методов. Он не отображает одно на другое.
С & quot; alias_method_chain: method,: new_feature & quot ;, как вы ссылаетесь на: method_without_new_feature? : method становится псевдонимом для: new_feature, поэтому кажется, что вы теряете возможность ссылаться на: method_without_new_feature? John Owens
Хотя эти два метода должны быть определены до того, как вы будете использовать alias_method_chain, не имеет значения, когда и где они были определены. Я не показываю метод переименования, поскольку мы предполагаем, что он уже существует. Если бы мы писали класс с нуля, было бы проще дать им знак «с» и "без" имена для начала, а не беспокоить alias_method_chain. Другими словами, мы предполагаем, что во время выполнения мы повторно открываем класс Person, чтобы добавить дополнительный метод. Если это не имеет смысла для вас, вам необходимо ознакомиться с открытыми классами Ruby.

Похожие вопросы