Должен ли я использовать псевдоним или 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) Вам не нужно набирать,

Это мало, я знаю, но когда вы делаете это несколько сотен раз по прошествии лет, вы просто предпочитаете псевдоним, когда это возможно.