Должен ли я использовать псевдоним или метод псевдонима?
Я нашел сообщение в блоге на 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
8 ответов:
alias_method
при необходимости можно переопределить. (это определено вModule
класса.)
alias
's поведение меняется в зависимости от его объема и может быть довольно непредсказуемым в разы.Вердикт: Использовать
alias_method
- это дает вам много гибкости.использование:
def foo "foo" end alias_method :baz, :foo
помимо синтаксиса, основное различие заключается в области:
# 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 #=> 'Gekky 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
Я думаю, что есть неписаное правило (что-то вроде соглашения), которое говорит использовать "псевдоним" только для регистрации псевдонима метода, означает, что если вы хотите дать пользователю вашего кода один метод с более чем одним именем:
class Engine def start #code goes here end alias run start end
Если вам нужно расширить свой код, используйте альтернативу ruby meta.
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
очко в пользу
alias
вместоalias_method
заключается в том, что его семантика распознается rdoc, что приводит к аккуратным перекрестным ссылкам в сгенерированной документации, в то время как rdoc полностью игнорируетalias_method
.
через год после постановки вопроса выходит новая статья на эту тему:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
кажется ,что " так много людей, так много умов."Из прежней статьи автор призывает использовать
alias_method
, в то время как последний предлагает использоватьalias
.однако есть общий обзор этих методов как в блогах, так и в ответах выше:
- использовать
alias
когда вы хотите ограничить сглаживание в область, где он определен- использовать
alias_method
разрешить наследуемым классам доступ к нему
теперь это обрабатывается в Ruby Style Guide:
предпочитаю псевдоним для сглаживания методов в лексической области видимости класса, как разрешение себя в этом контексте также лексическое, и оно четко сообщает пользователю, что косвенность вашего псевдонима не будет изменен во время выполнения или любым подклассом, если не сделано явный.
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
alias_methodnew_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 и его использование.
хотя это может быть незначительным, но есть две вещи, которые мне нравятся в alias, больше, чем alias_method:
(1) псевдоним короче
и
(2) вам не нужно вводить ,
Это немного, я знаю, но когда вы делаете это несколько сотен раз, когда проходят годы, вы просто предпочитаете псевдоним, когда это возможно