370 Stimmen

Sollte ich alias oder alias_method verwenden?

Ich habe einen Blogbeitrag auf alias vs. alias_method . Wie in dem Beispiel in diesem Blogbeitrag gezeigt, möchte ich einfach eine Methode auf eine andere innerhalb derselben Klasse verweisen. Welches sollte ich verwenden? Ich sehe immer alias benutzt, aber jemand hat mir gesagt alias_method ist besser.

Verwendung des 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

Link zum Blogbeitrag hier

388voto

Jacob Relkin Punkte 156445

alias_method kann bei Bedarf neu definiert werden. (Sie ist definiert in der Module Klasse).

alias Das Verhalten des Programms ändert sich je nach Umfang und kann manchmal recht unvorhersehbar sein.

Fazit: Verwenden Sie alias_method - Es gibt Ihnen eine Menge mehr Flexibilität.

Verwendung:

def foo
  "foo"
end

alias_method :baz, :foo

92voto

Darme Punkte 6749

Abgesehen von der Syntax, der Hauptunterschied liegt im Scoping :

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

Im obigen Fall übernimmt die Methode "name" die in der Klasse "Developer" definierte Methode "full_name". Versuchen wir es nun mit 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'

Bei der Verwendung von Alias kann die Methode "name" nicht auf die in Developer definierte Methode "full_name" zugreifen.

Der Grund dafür ist alias ist ein Schlüsselwort, das lexikalisch skaliert ist. Das heißt, es behandelt self als den Wert von self zum Zeitpunkt des Einlesens des Quellcodes. Im Gegensatz dazu alias_method behandelt self als den zur Laufzeit ermittelten Wert.

Source : http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

39voto

Bruno Rohée Punkte 3217

Ein Punkt, der für die alias anstelle von alias_method ist, dass seine Semantik von rdoc erkannt wird, was zu sauberen Querverweisen in der generierten Dokumentation führt, während rdoc die alias_method .

37voto

agenty Punkte 351

Ich glaube, es gibt eine ungeschriebene Regel (so etwas wie eine Konvention), die besagt, dass man 'alias' nur für die Registrierung eines Methodennamen-Alias verwenden soll, d.h. wenn man dem Benutzer seines Codes eine Methode mit mehr als einem Namen geben möchte:

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

Wenn Sie Ihren Code erweitern müssen, verwenden Sie die Ruby-Meta-Alternative.

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

27voto

Kamil Lelonek Punkte 14110

Ein Jahr nach dieser 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 früheren Artikel Autor ermutigt zu verwenden alias_method , während letztere vorschlägt, die alias .

Es gibt jedoch einen gemeinsamen Überblick über diese Methoden in beiden Blogposts und Antworten oben:

  • verwenden. alias wenn Sie Aliasing auf den Bereich beschränken wollen, in dem es definiert ist
  • verwenden. alias_method um geerbten Klassen den Zugriff darauf zu ermöglichen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X