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
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
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
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
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
.
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żywaniaalias_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
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
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.
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
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