Является ли alias_method_chain синонимом alias_method?

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

Ответы на вопрос(2)

Решение Вопроса

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

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

 16 июл. 2009 г., 00:54
Вы можете объяснить, почему? :)
 16 июл. 2009 г., 20:05

Ваш ответ на вопрос