Должен ли я использовать псевдоним или alias_method?
Я нашел сообщение в блоге alias
vs. 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
Ссылка на сообщение в блоге здесь
Ответы
Ответ 1
alias_method
при необходимости может быть переопределен. (он определен в классе Module
.)
alias
поведение изменяется в зависимости от его объема и может быть довольно непредсказуемым в разы.
Вердикт: используйте alias_method
- это дает вам больше гибкости.
Использование:
def foo
"foo"
end
alias_method :baz, :foo
Ответ 2
Помимо синтаксиса, основное отличие заключается в области видимости:
# scoping with alias_method
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias_method :name, :full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Geeky geek'
В приведенном выше случае метод "name" выбирает метод "full_name", определенный в классе "Developer". Теперь давайте попробуем с alias
.
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias name full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Johnnie Walker'
При использовании псевдонима метод "name" не может выбрать метод "full_name", определенный в Developer.
Это потому, что alias
является ключевым словом и имеет лексическую область видимости. Это означает, что он рассматривает self
как ценность себя во время чтения исходного кода. В отличие от alias_method
трактует self
как значение, определенное во время выполнения.
Источник: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
Ответ 3
Я думаю, что существует неписаное правило (что-то вроде соглашения), в котором говорится, что он использует "псевдоним" только для регистрации псевдонима метода-имени, означает, что если вы хотите дать пользователю вашего кода один метод с несколькими именами
class Engine
def start
#code goes here
end
alias run start
end
Если вам нужно расширить код, используйте альтернативу ruby.
class Engine
def start
puts "start me"
end
end
Engine.new.start() # => start me
Engine.class_eval do
unless method_defined?(:run)
alias_method :run, :start
define_method(:start) do
puts "'before' extension"
run()
puts "'after' extension"
end
end
end
Engine.new.start
# => 'before' extension
# => start me
# => 'after' extension
Engine.new.run # => start me
Ответ 4
Точка в пользу alias
вместо alias_method
заключается в том, что ее семантика распознается rdoc, что приводит к аккуратным перекрестным ссылкам в сгенерированной документации, тогда как rdoc полностью игнорирует alias_method
.
Ответ 5
Через год после вопроса возникает новая статья на эту тему:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Кажется, что "столько людей, столько умов". Из прежней статьи автор рекомендует использовать alias_method
, в то время как последнее предлагает использовать alias
.
Однако существует общий обзор этих методов как в блогах, так и в ответах выше:
- используйте
alias
, если вы хотите ограничить наложение на область, в которой она определена
- используйте
alias_method
, чтобы позволить унаследованным классам обращаться к нему.
Ответ 6
Это теперь обрабатывается в Руководстве по стилю Ruby:
Предпочитайте псевдоним, когда псевдонимы методов в лексической области видимости класса, так как разрешение self в этом контексте также лексично, и он четко сообщает пользователю, что косвенность вашего псевдонима не будет изменена во время выполнения или каким-либо подклассом, если это не сделано явно.
class Westerner
def first_name
@names.first
end
alias given_name first_name
end
Всегда используйте alias_method при совмещении методов модулей, классов или одноэлементных классов во время выполнения, так как лексическая область действия псевдонима приводит к непредсказуемости в этих случаях.
module Mononymous
def self.included(other)
other.class_eval { alias_method :full_name, :given_name }
end
end
class Sting < Westerner
include Mononymous
end
Ответ 7
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 и его использование.
Ответ 8
Хотя это может быть незначительно, но есть две вещи, которые мне нравятся в псевдониме, больше, чем alias_method:
(1) псевдоним короче
и
(2) Вам не нужно набирать,
Это мало, я знаю, но когда вы делаете это несколько сотен раз по прошествии лет, вы просто предпочитаете псевдоним, когда это возможно.