Znalazłem blogu na alias
wersetach alias_method
. Jak pokazano w przykładzie podanym w tym poście na blogu, chcę po prostu aliasować metodę do innej metody w tej samej klasie. Z którego powinienem korzystać? Zawsze widzę alias
używane, ale ktoś mi powiedział, że alias_method
jest lepszy.
Zastosowanie aliasu
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Zastosowanie metody alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
„podczas aliasingu metod w zakresie klasy leksykalnej” ialias_method
„podczas aliasingu metod modułów, klas lub klas singletonów w czasie wykonywania” github.com/bbatsov/ruby-style-guide#alias-method-lexicallyOdpowiedzi:
alias_method
w razie potrzeby można przedefiniować. (jest zdefiniowane wModule
klasie).alias
zachowanie zmienia się w zależności od jego zakresu i może być czasami nieprzewidywalne.Werdykt: Użyj
alias_method
- daje ton większą elastyczność.Stosowanie:
źródło
alias :new_method_name :old_method_name
LUBalias_method :new_method_name, :old_method_name
alias_method
jest określany w czasie wykonywania, a nie podczas odczytywania kodualias
, więc zachowuje się bardziej tak, jak byśmy tego oczekiwali .def
stosunku dodefine_method
: „define_method
można zdefiniować na nowo, jeśli zajdzie taka potrzeba. (Jest zdefiniowane wModule
klasie.)def
Zachowanie zmienia się w zależności od jego zakresu i czasami może być dość nieprzewidywalne. Werdykt: Użyjdefine_method
- daje ton większa elastyczność ”.Oprócz składni główna różnica polega na określaniu zakresu :
W powyższym przypadku metoda „name” wybiera metodę „full_name” zdefiniowaną w klasie „Developer”. Teraz spróbujmy z
alias
.Przy użyciu aliasu metoda „name” nie jest w stanie wybrać metody „full_name” zdefiniowanej w Developer.
Wynika to z tego, że
alias
jest słowem kluczowym i ma zasięg leksykalny. Oznacza to, że traktuje toself
jako wartość self w momencie odczytu kodu źródłowego. W przeciwieństwie do tegoalias_method
traktuje sięself
jako wartość określoną w czasie wykonywania.Źródło: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
źródło
Punktem za
alias
zamiastalias_method
jest to, że jego semantyczny jest rozpoznawany przez rdoc, co prowadzi do dokładnych odniesień w wygenerowanej dokumentacji, podczas gdy rdoc całkowicie ignorujealias_method
.źródło
alias_method
? Wydaje się to bardzo mało prawdopodobne, a jeśli ktoś to zrobi, powinien być skłonny ponieść konsekwencje RDoc. Jeśli chodzi o to, że jest to niemożliwe, to dlaczego tak myślisz i jak myślisz, że Yardoc to robi?Myślę, że istnieje niepisana reguła (coś w rodzaju konwencji), która mówi, aby używać „aliasu” tylko do rejestrowania aliasu nazwa-metody, oznacza to, że jeśli chcesz dać użytkownikowi swojego kodu jedną metodę o więcej niż jednej nazwie:
Jeśli potrzebujesz rozszerzyć swój kod, użyj ruby meta alternatywy.
źródło
Rok po zadaniu pytania pojawia się nowy artykuł na ten temat:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Wydaje się, że „tylu ludzi, tyle umysłów”. Z pierwszego artykułu autor zachęca do korzystania
alias_method
, podczas gdy drugi sugeruje stosowaniealias
.Istnieje jednak ogólny przegląd tych metod w obu postach na blogu i w odpowiedziach powyżej:
alias
gdy chcesz ograniczyć aliasing do zakresu, w którym jest zdefiniowanyalias_method
aby zezwolić na dostęp odziedziczonym klasomźródło
Autorzy klejnotów rubocop proponują w Przewodniku po stylu Ruby :
źródło
alias_method nowa_metoda , stara_metoda
old_method zostanie zadeklarowany w klasie lub module, który jest teraz dziedziczony w naszej klasie, w której zostanie użyty new_method .
mogą być zmienne lub obie te metody.
Załóżmy, że Class_1 ma starą metodę, a Class_2 i Class_3 oba dziedziczą Class_1.
Jeśli inicjalizacja klasy_2 i klasy_3 odbywa się w klasie_1, oba mogą mieć inną nazwę w klasie_2 i klasie_3 oraz jej użycie.
źródło