2011-01-21 1 views
317

Ho trovato un post sul blog alias rispetto a alias_method. Come mostrato nell'esempio fornito in quel post del blog, voglio semplicemente fare l'alias di un metodo ad un altro all'interno della stessa classe. Quale dovrei usare? Ho sempre visto alias usato, ma qualcuno mi ha detto che alias_method è meglio.Devo usare alias o alias_method?

L'utilizzo di alias

class User 

    def full_name 
    puts "Johnnie Walker" 
    end 

    alias name full_name 
end 

User.new.name #=>Johnnie Walker 

L'utilizzo di alias_method

class User 

    def full_name 
    puts "Johnnie Walker" 
    end 

    alias_method :name, :full_name 
end 

User.new.name #=>Johnnie Walker 

Blog post link here

+4

Questo post non risponde alla tua domanda? – marcog

+3

@marcog: l'ho letto e non ne sono convinto. Definire gli alias nei metodi, non è qualcosa che si dovrebbe fare spesso. –

+2

@digitalextremist link funziona –

risposta

355

alias_method può essere ridefinito se necessario. (è definito nella classe Module.)

alias Il comportamento cambia a seconda del suo ambito e può essere abbastanza imprevedibile a volte.

Verdetto: Usa alias_method - ti dà una maggiore flessibilità.

Usage:

def foo 
    "foo" 
end 

alias_method :baz, :foo 
+39

Cosa intendi per imprevedibile. Ingenuamente, si direbbe che l'opzione meno flessibile sarà più prevedibile. Inoltre, puoi fornire qualche esempio pratico di beneficiare della ridefinizione di alias_method? –

+22

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

+7

esempio d'uso: 'alias: new_method_name: old_method_name' OR' alias_method: new_method_name,: old_method_name' –

30

Un punto a favore di alias invece di alias_method è che la sua semantica è riconosciuto da rdoc, portando a riferimenti incrociati ordinate nella documentazione generata, mentre rdoc ignorano completamente alias_method.

+54

Forse RDoc dovrebbe iniziare a trattare alias_method come alias. Dovremmo dirglielo;) –

+9

Totalmente d'accordo. Yard gestisce questo piuttosto bene se ricordo bene ... –

+16

Un motivo in più per usare [Yardoc] (http://yardoc.org/) invece di RDoc. – iain

-18

anche se può essere minore, ma ci sono due cose che mi piace di alias, più che alias_method:

(1) alias è più breve

e

(2) Non dovete digitare il,

Questo è poco, lo so, ma quando si fa questo un paio di centinaia di volte come gli anni passano, semplicemente tendono a preferire, quando possibile alias

+10

Mi stavo chiedendo perché questo avesse così tanti downvotes e non un commento. Dopo aver letto, so perché. – DickieBoy

33

Penso che ci sia una regola non scritta (qualcosa come una convenzione) che dice di usare "alias" solo per registrare un alias nome-metodo, significa che se ti piace dare all'utente del tuo codice un metodo con più di un nome:

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

Se è necessario estendere il codice, utilizzare l'alternativa del rubino 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 
16

Un anno dopo aver chiesto la questione arriva un nuovo articolo sul tema:

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

Sembra che "tanti uomini, tante menti." Dal precedente articolo l'autore incoraggia ad utilizzare alias_method, mentre il secondo suggerisce di utilizzare alias.

Tuttavia c'è una visione comune di questi metodi in entrambi blogposts e risposte di cui sopra:

  • uso alias quando si desidera limitare aliasing per l'ambito in cui è definito
  • uso alias_method per consentire classi ereditate per l'accesso esso
36

parte la sintassi, la differenza principale è nella 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 #=> 'Gekky geek' 

Nel metodo di caso sopra riportato "nome" seleziona il metodo "nome_completo" definito nella classe "Sviluppatore". Ora proviamo con 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' 

Con l'utilizzo di alias il “nome” metodo non è in grado di scegliere il metodo di “FULL_NAME” definito in Developer.

Questo perché alias è una parola chiave ed è in ambito lessicale. Significa che considera self come valore di self al momento della lettura del codice sorgente. Al contrario, alias_method tratta il valore self come valore determinato in fase di esecuzione.

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

0

Questa viene ora gestita nel Ruby Style Guide:

Preferisco alias quando i metodi di aliasing in ambito di classe lessicale come la risoluzione di sé in questo contesto è anche lessicale, ed è comunica chiaramente all'utente che l'indirezione del proprio alias non verrà modificata in fase di runtime o in alcuna sottoclasse, a meno che non venga reso esplicito .

class Westerner 
    def first_name 
    @names.first 
    end 

alias given_name first_name 
end 

utilizzare sempre alias_method quando aliasing metodi di moduli, classi o classi singleton a runtime, come ambito lessicale di alias comporta imprevedibilità in questi casi

module Mononymous 
    def self.included(other) 
    other.class_eval { alias_method :full_name, :given_name } 
    end 
end 

class Sting < Westerner 
    include Mononymous 
end