362 votes

Dois-je utiliser alias ou alias_method ?

J'ai trouvé un article de blog sur alias vs. alias_method . Comme le montre l'exemple donné dans cet article de blog, je veux simplement aliaser une méthode à une autre dans la même classe. Que dois-je utiliser ? Je vois toujours alias utilisé, mais quelqu'un m'a dit alias_method est meilleur.

Utilisation de l'alias

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias name full_name
end

User.new.name #=>Johnnie Walker

Utilisation de l'alias_méthode

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias_method :name, :full_name
end

User.new.name #=>Johnnie Walker

Lien vers l'article du blog ici

4 votes

Ce post ne répond-il pas à votre question ?

4 votes

@marcog : Je l'ai lu en entier, et je ne suis pas convaincu. Définir des alias à l'intérieur de méthodes, ce n'est pas quelque chose qu'on devrait faire souvent.

2 votes

Le lien @digitalextremist fonctionne.

383voto

Jacob Relkin Points 90729

alias_method peut être redéfini si nécessaire. (il est défini dans le Module classe.)

alias Le comportement de l'entreprise varie en fonction de sa portée et peut parfois être imprévisible.

Verdict : Utilisez alias_method - ça vous donne beaucoup plus de flexibilité.

Utilisation :

def foo
  "foo"
end

alias_method :baz, :foo

46 votes

Que voulez-vous dire par "imprévisible". Naïvement, on pourrait dire que l'option la moins flexible sera plus prévisible. Par ailleurs, pouvez-vous fournir un exemple pratique des avantages de la redéfinition d'alias_method ?

7 votes

Exemple de cas d'utilisation : alias :new_method_name :old_method_name OU alias_method :new_method_name, :old_method_name

12 votes

Le mot qu'il cherche ici est "plus". attendu les résultats. alias_method est déterminé au moment de l'exécution et non lors de la lecture du code, comme dans le cas de alias donc il se comporte plus comme nous le ferions s'attendre à pour le faire.

84voto

Darmen Points 1136

En dehors de la syntaxe, la principale différence réside dans le champ d'application :

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

Dans le cas ci-dessus, la méthode "name" reprend la méthode "full_name" définie dans la classe "Developer". Essayons maintenant avec 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'

Avec l'utilisation d'un alias, la méthode "name" n'est pas capable de récupérer la méthode "full_name" définie dans Developer.

Cela s'explique par le fait que alias est un mot-clé et il a une portée lexicale. Cela signifie qu'il traite self comme la valeur de self au moment où le code source a été lu . En revanche alias_method traite self comme la valeur déterminée au moment de l'exécution.

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

35voto

Bruno Rohée Points 1691

Un point en faveur de alias au lieu de alias_method est que sa sémantique est reconnue par rdoc, ce qui conduit à des références croisées soignées dans la documentation générée, alors que rdoc ignore complètement alias_method .

56 votes

Peut-être que RDoc devrait commencer à traiter alias_méthode de la même manière que alias. Nous devrions leur en parler ;)

9 votes

Comment RDoc est-il censé comprendre les conséquences d'une méthode qui est évaluée au moment de l'exécution ?

0 votes

@user1115652 Est-ce que votre point est que quelqu'un pourrait avoir peau de singe alias_method ? Cela semble vraiment peu probable, et si quelqu'un le fait, alors il devrait être prêt à en subir les conséquences dans le RDoc. Si votre point de vue est que c'est impossible, alors pourquoi pensez-vous cela et comment pensez-vous que Yardoc le fait ?

35voto

agenty Points 71

Je pense qu'il y a une règle non écrite (quelque chose comme une convention) qui dit d'utiliser 'alias' juste pour enregistrer un alias de nom de méthode, c'est-à-dire si vous voulez donner à l'utilisateur de votre code une méthode avec plus d'un nom :

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

Si vous avez besoin d'étendre votre code, utilisez l'alternative ruby meta.

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

26voto

squixy Points 1146

Un an après avoir posé la question, voici un nouvel article sur le sujet :

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

Il semble que "tant d'hommes, tant d'esprits". L'auteur de l'article précédent encourage à utiliser alias_method tandis que le dernier suggère d'utiliser alias .

Cependant, il existe une vue d'ensemble commune de ces méthodes dans les deux articles de blog et les réponses ci-dessus :

  • utiliser alias lorsque vous voulez limiter l'aliasing à la portée où il est défini.
  • utiliser alias_method pour permettre aux classes héritées d'y accéder

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X