Действительно ли alias_method_chain синонимичен с alias_method?

Решение Alien состоит в том, чтобы сделать вещи максимально простыми:

  1. использовать ключевое слово enum (зарезервировано в javascript)
  2. Если ключевое слово enum зарезервировано, но не реализовано в вашем javascript определите следующее

    const enumerate = spec => spec.split(/\s*,\s*/)
      .reduce((e, n) => Object.assign(e,{[n]:n}), {}) 
    

Теперь вы можете легко использовать его

const kwords = enumerate("begin,end, procedure,if")
console.log(kwords, kwords.if, kwords.if == "if", kwords.undef)

Я не вижу причин делать значения перечисления явными переменными. Сценарии в любом случае являются морфизированными, и не имеет значения, является ли часть вашего кода строкой или допустимым кодом. Что действительно важно, так это то, что вам не нужно иметь дело с тоннами кавычек при их использовании или определении.

22
задан John Owens 23 June 2009 в 19:19
поделиться

2 ответа

No. alias_method - стандартный метод Ruby. alias_method_chain - это надстройка Rails, разработанная для упрощения обычного действия по наложению псевдонима старого метода на новое имя, а затем псевдонима нового метода на исходное имя. Так, например, если вы создаете новую версию метода метода с новой функцией 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 . Все, что он делает, это берет строку типа «John Doe», разделяет ее на пробел и присваивает части first_name и last_name. Например:

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

Теперь у нас проблема. Мы продолжаем получать новые имена, которые не t правильно написано с заглавной буквы. Итак, мы можем написать новый метод 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_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
56
ответ дан 29 November 2019 в 03:50
поделиться

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

5
ответ дан 29 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

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