Ich fand eine Blog - Post auf alias
vs. alias_method
. Wie in dem Beispiel in diesem Blog-Beitrag gezeigt, möchte ich einfach eine Methode einer anderen innerhalb derselben Klasse zuordnen. Welches soll ich verwenden? Ich sehe immer alias
gebraucht, aber jemand sagte mir, es alias_method
sei besser.
Verwendung von Alias
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
Verwendung von alias_method
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
alias
"beim Aliasing von Methoden im lexikalischen Klassenbereich" undalias_method
"beim Aliasing von Methoden von Modulen, Klassen oder Singleton-Klassen zur Laufzeit" github.com/bbatsov/ruby-style-guide#alias-method-lexicallyAntworten:
alias_method
kann bei Bedarf neu definiert werden. (Es ist in derModule
Klasse definiert .)alias
Das Verhalten ändert sich je nach Umfang und kann manchmal ziemlich unvorhersehbar sein.Fazit: Verwenden
alias_method
- es gibt Ihnen eine Tonne mehr Flexibilität.Verwendungszweck:
quelle
alias :new_method_name :old_method_name
ORalias_method :new_method_name, :old_method_name
alias_method
wird zur Laufzeit bestimmt und nicht, wenn der Code gelesen wirdalias
, also verhält er sich mehr so, wie wir es erwarten würden .def
vs. argumentierendefine_method
: "define_method
Kann bei Bedarf neu definiert werden. (Es wird in derModule
Klasse definiert .)def
Das Verhalten ändert sich je nach Umfang und kann manchmal ziemlich unvorhersehbar sein. Urteil: Verwendendefine_method
- es gibt Ihnen eine Menge mehr Flexibilität. "Abgesehen von der Syntax liegt der Hauptunterschied im Umfang :
Im obigen Fall wählt die Methode "name" die in der Klasse "Developer" definierte Methode "full_name" aus. Versuchen wir es jetzt mit
alias
.Bei Verwendung eines Alias kann die Methode "name" die in Developer definierte Methode "full_name" nicht auswählen.
Dies liegt daran, dass
alias
es sich um ein Schlüsselwort handelt, das einen lexikalischen Gültigkeitsbereich hat. Dies bedeutet, dass esself
als der Wert von self zum Zeitpunkt des Lesens des Quellcodes behandelt wird. Im Gegensatz dazu wird als der zur Laufzeit ermittelte Wertalias_method
behandeltself
.Quelle: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
quelle
Ein Punkt,
alias
der dafüralias_method
spricht, ist, dass seine Semantik von rdoc erkannt wird, was zu sauberen Querverweisen in der generierten Dokumentation führt, während rdoc dies vollständig ignoriertalias_method
.quelle
alias_method
? Das scheint wirklich unwahrscheinlich, und wenn jemand das tut, sollte er bereit sein, die Konsequenzen von RDoc zu tragen. Wenn Sie der Meinung sind, dass es unmöglich ist, warum denken Sie das und wie macht Yardoc das?Ich denke, es gibt eine ungeschriebene Regel (so etwas wie eine Konvention), die besagt, dass 'Alias' nur zum Registrieren eines Methodennamen-Alias verwendet wird. Wenn Sie dem Benutzer Ihres Codes eine Methode mit mehr als einem Namen geben möchten:
Wenn Sie Ihren Code erweitern müssen, verwenden Sie die Ruby-Meta-Alternative.
quelle
Ein Jahr nach der Frage erscheint ein neuer Artikel zu diesem Thema:
http://erniemiller.org/2014/10/23/in-defense-of-alias/
Es scheint, dass "so viele Männer, so viele Köpfe". Aus dem ersteren Artikel ermutigt der Autor zur Verwendung
alias_method
, während der letztere die Verwendung vorschlägtalias
.Es gibt jedoch einen allgemeinen Überblick über diese Methoden sowohl in Blogposts als auch in den obigen Antworten:
alias
Sie diese Option, wenn Sie das Aliasing auf den Bereich beschränken möchten, in dem es definiert istalias_method
diese Option, um geerbten Klassen den Zugriff darauf zu ermöglichenquelle
Die Rubocop-Edelstein-Mitwirkenden schlagen in ihrem Ruby Style Guide vor :
quelle
alias_method new_method , old_method
old_method wird in einer Klasse oder einem Modul deklariert, das jetzt an unsere Klasse vererbt wird, in der new_method verwendet wird.
Diese können variabel sein oder beide Methoden.
Angenommen, Class_1 hat old_method und Class_2 und Class_3 erben beide Class_1.
Wenn die Initialisierung von Class_2 und Class_3 in Class_1 erfolgt, können beide in Class_2 und Class_3 und deren Verwendung unterschiedliche Namen haben.
quelle