Должен ли я использовать псевдоним или метод псевдонима?


Я нашел сообщение в блоге на 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 331

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) вам не нужно вводить ,

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