Я нашел сообщение в блоге на alias
против alias_method
. Как показано в примере, приведенном в этом сообщении в блоге, я просто хочу присвоить псевдоним методу другому в том же классе. Какой я должен использовать? Я всегда вижу б alias
, но кто-то сказал мне, alias_method
что лучше.
Использование псевдонима
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Использование alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
«при псевдонимах методов в области видимости лексических классов» иalias_method
«при псевдонимах методов модулей, классов или одноэлементных классов во время выполнения» github.com/bbatsov/ruby-style-guide#alias-method-lexicallyОтветы:
alias_method
может быть переопределено при необходимости. (это определено вModule
классе.)alias
Поведение меняется в зависимости от его масштабов и может быть довольно непредсказуемым время от времени.Вердикт: используйте
alias_method
- это дает вам большую гибкость.Применение:
источник
alias :new_method_name :old_method_name
ИЛИalias_method :new_method_name, :old_method_name
alias_method
определяется во время выполнения, а не когда код читается, напримерalias
, поэтому он ведет себя больше, чем мы ожидаем .def
противdefine_method
: «define_method
может быть переопределено, если это необходимо. (Это определено вModule
классе.)def
Поведение меняется в зависимости от области его применения и может быть довольно непредсказуемым время от времени. Вердикт: используйтеdefine_method
- это дает вам тонну больше гибкости. "Помимо синтаксиса, основное отличие заключается в области видимости :
В приведенном выше случае метод «name» выбирает метод «full_name», определенный в классе «Developer». Теперь давайте попробуем с
alias
.При использовании псевдонима метод «name» не может выбрать метод «full_name», определенный в Developer.
Это потому, что
alias
это ключевое слово, и оно имеет лексическую область. Это означает, что он считаетсяself
значением self на момент чтения исходного кода. Напротив,alias_method
трактуетсяself
как значение, определенное во время выполнения.Источник: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
источник
Точка зрения
alias
вместо вместо этогоalias_method
заключается в том, что его семантика распознается rdoc, что приводит к аккуратным перекрестным ссылкам в сгенерированной документации, в то время как rdoc полностью игнорируетalias_method
.источник
alias_method
? Это , кажется , действительно маловероятно, и если кто - то делает это, то они должны быть готовы страдать от последствий в RDoc. Если вы считаете, что это невозможно, то почему вы так думаете и как, по вашему мнению, это делает Yardoc?Я думаю, что есть неписанное правило (что-то вроде соглашения), которое говорит, что использовать «псевдоним» просто для регистрации псевдонима имени метода, означает, что если вы хотите дать пользователю вашего кода один метод с более чем одним именем:
Если вам нужно расширить свой код, используйте альтернативу ruby meta.
источник
Через год после постановки вопроса выходит новая статья на эту тему:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Кажется, что «так много людей, так много умов». Из первой статьи автор рекомендует использовать
alias_method
, а вторая предлагает использоватьalias
.Однако общий обзор этих методов приведен в постах блога и в ответах выше:
alias
когда вы хотите ограничить алиасинг областью, в которой он определенalias_method
для доступа к наследуемым классамисточник
Авторы Rubocop Gem предлагают в своем руководстве по стилю Ruby :
источник
alias_method new_method , old_method
old_method будет объявлен в классе или модуле, который теперь наследуется нашему классу, где будет использоваться new_method .
они могут быть переменными или оба метода.
Предположим, что Class_1 имеет old_method, и Class_2 и Class_3 оба они наследуют Class_1.
Если инициализация Class_2 и Class_3 выполняется в Class_1, то оба могут иметь разные имена в Class_2 и Class_3 и их использование.
источник