Czy powinienem użyć metody alias lub alias?

Znalazłem wpis na blogu alias vs. alias_method. Jak pokazano w przykładzie podanym w tym poście na blogu, po prostu chcę alias metody do innej w tej samej klasie. Którego powinienem użyć? Zawsze widzę alias używane, ale ktoś powiedział mi {[3] } jest lepsze.

Użycie aliasu

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias name full_name
end

User.new.name #=>Johnnie Walker

Użycie alias_method

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias_method :name, :full_name
end

User.new.name #=>Johnnie Walker

Blog post link tutaj

 331
Author: philant, 2011-01-21

8 answers

alias_method w razie potrzeby można je ponownie zdefiniować. (jest zdefiniowana w klasie Module.)

alias'zachowanie s zmienia się w zależności od jego zakresu i może być czasami dość nieprzewidywalne.

Werdykt: użyj alias_method - daje Ci o wiele większą elastyczność.

Użycie:

def foo
  "foo"
end

alias_method :baz, :foo
 369
Author: Jacob Relkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 19:58:35

Oprócz składni, główną różnicą jest zakres :

# 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'

W powyższym przypadku metoda " name "wybiera metodę" full_name "zdefiniowaną w klasie" Developer". Teraz spróbujmy z 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'

Przy użyciu aliasu metoda " name "nie jest w stanie wybrać metody" full_name " zdefiniowanej w Developer.

Dzieje się tak dlatego, że alias jest słowem kluczowym i ma leksykalny zasięg. Oznacza to, że traktuje self jako wartość self w momencie odczytu kodu źródłowego . Natomiast alias_method traktuje self jako wartość określoną w czasie wykonywania.

Źródło: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

 43
Author: Darme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 06:40:28

Myślę, że istnieje niepisana zasada (coś w rodzaju konwencji), która mówi, aby używać 'alias' tylko do rejestracji metody-name alias, czyli jeśli chcesz dać użytkownikowi kodu jedną metodę z więcej niż jedną nazwą:

class Engine
  def start
    #code goes here
  end
  alias run start
end

Jeśli chcesz rozszerzyć swój kod, użyj alternatywy meta 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
 33
Author: agenty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-29 12:42:43

Punktem przemawiającym za alias zamiast alias_method jest to, że jego semantyka jest rozpoznawana przez rdoc, co prowadzi do schludnych odsyłaczy w Wygenerowanej dokumentacji, podczas gdy RDOC całkowicie ignoruje alias_method.

 32
Author: Bruno Rohée,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-03 18:22:57

Rok po zadaniu pytania pojawia się nowy artykuł na ten temat:

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

Wydaje się, że " tak wielu ludzi, tak wiele umysłów."Z poprzedniego artykułu autor zachęca do używania alias_method, podczas gdy ten drugi sugeruje użycie alias.

Jednak istnieje wspólny przegląd tych metod zarówno na blogach, jak i w odpowiedziach powyżej:

  • użyj alias, gdy chcesz ograniczyć aliasing do zakresu, w którym jest defined
  • użyj alias_method, aby umożliwić dziedziczonym klasom dostęp do niego
 20
Author: Kamil Lelonek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 01:03:53

Jest to teraz obsługiwane w Ruby Style Guide:

Preferuje aliasing metod w zakresie klasy leksykalnej jako rozwiązywanie siebie w tym kontekście jest również leksykalne, a to komunikuje wyraźnie użytkownikowi, że przekierowanie twojego aliasu nie będą zmieniane w czasie wykonywania ani przez żadną podklasę, chyba że wyraźnie.

class Westerner
  def first_name
   @names.first
  end

 alias given_name first_name
end

Zawsze używaj alias_method podczas aliasowania metod modułów, klas lub singleton klas w czasie wykonywania, jako zakres leksykalny aliasu prowadzi do nieprzewidywalność w tych przypadkach

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

class Sting < Westerner
  include Mononymous
end
 2
Author: Doktor OSwaldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 12:10:11

Alias_method new_method, old_method

Old_method zostanie zadeklarowany w klasie lub module, który jest dziedziczony do naszej klasy, gdzie zostanie użyty new_method .

Mogą to być zmienne lub metody.

Załóżmy, że Klasa_1 ma old_method, a Klasa_2 i Klasa_3 obie dziedziczą Klasa_1.

Jeżeli inicjalizacja Klas_2 i Klas_3 odbywa się w Klasach_1 to obie mogą mieć inną nazwę w Klasach_2 i Klasa_3 i jej zastosowanie.

 0
Author: Ajay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 11:43:23

Chociaż to może być drobne, ale są dwie rzeczy, które lubię w alias, bardziej niż alias_method:

(1) alias jest krótszy

I

(2) nie musisz wpisywać,

To niewiele, wiem, ale kiedy robisz to kilkaset razy w miarę upływu lat, po prostu wolisz alias, gdy tylko to możliwe

 -18
Author: shevy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 15:27:06