Должен ли я использовать псевдоним или alias_method? - PullRequest
348 голосов
/ 21 января 2011

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

375 голосов
/ 21 января 2011

alias_method может быть переопределено при необходимости. (определено в Module классе.)

Поведение

alias меняется в зависимости от области его применения и может быть довольно непредсказуемым.

Вердикт: используйте alias_method - это дает вам большую гибкость.

Использование:

def foo
  "foo"
end

alias_method :baz, :foo
55 голосов
/ 05 декабря 2014

Помимо синтаксиса, основное отличие заключается в определении объема :

# 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 как значение self во время чтения исходного кода.В отличие от этого alias_method обрабатывает self как значение, определенное во время выполнения.

Источник: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

34 голосов
/ 12 декабря 2013

Я думаю, что есть неписанное правило (что-то вроде соглашения), которое говорит, что использовать «псевдоним» только для регистрации псевдонима имени метода, означает, что если вы хотите дать пользователю вашего кода один метод с более чем одним именем :

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
33 голосов
/ 03 марта 2011

Преимущество alias вместо alias_method заключается в том, что его семантика распознается rdoc, что приводит к аккуратным перекрестным ссылкам в сгенерированной документации, тогда как rdoc полностью игнорирует alias_method.

22 голосов
/ 01 ноября 2014

Через год после постановки вопроса появляется новая статья на эту тему:

http://erniemiller.org/2014/10/23/in-defense-of-alias/

Кажется, что "так много людей, так много умов".В первой статье автор рекомендует использовать alias_method, а во второй предлагается использовать alias.

Однако общий обзор этих методов приведен в обоих постах и ​​в ответах выше:

  • используйте alias, если хотите ограничить псевдонимы областью, в которой он определен
  • используйте alias_method, чтобы разрешить наследованным классам доступ к нему
9 голосов
/ 10 января 2018

Теперь это обрабатывается в Ruby Style Guide :

Предпочитайте псевдонимы, когда методы псевдонимов в области видимости лексического класса также являются разрешением self в этом контексте, ион четко сообщает пользователю, что косвенность вашего псевдонима не будет изменена во время выполнения или каким-либо подклассом, если это не оговорено явным образом.классы или одноэлементные классы во время выполнения, так как лексическая область псевдонима приводит к непредсказуемости в этих случаях

module Mononymous
  def self.included(other)
    other.class_eval { alias_method :full_name, :given_name }
  end
end

class Sting < Westerner
  include Mononymous
end
0 голосов
/ 10 апреля 2018

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 и их использование.

0 голосов
/ 29 октября 2013

Хотя это может быть второстепенно, но в псевдониме есть две вещи, которые мне нравятся больше, чем alias_method:

(1) псевдоним короче

и

(2) Вам не нужно вводить,

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

...