2012-11-22 12 views
11

Questo mi tiene sveglio la notte per un po '.Come è consentita la sintassi dell'alias di Ruby?

class Foo 
    def bar 
    'bar' 
    end 

    # What the hell is going on here?!? 
    alias :baz :bar 
end 

Foo.new.baz #=> 'bar' 

Perché alias prendere 2 simbolo come argomenti, ma senza una virgola che li separa? Non sembra essere alcuna forma di sintassi valida in nessun altro contesto. In effetti, se si utilizza una virgola, in realtà genera un errore di sintassi.

alias :bar, :baz 
# syntax error, unexpected ',' 

Tuttavia, se provo a passare 2 simbolo con lo stesso modo di mio metodo, esplode anche:

def somemethod(*args) 
    :whatever 
end 
somemethod :a :b 
# syntax error, unexpected ':', expecting $end 
  1. Allora, perché è il metodo alias arrivare a utilizzare una sintassi nulla altro da usare?
  2. È possibile utilizzare questa sintassi in qualsiasi altro contesto?
  3. Qual è il vantaggio di utilizzare questa stranezza della sintassi dispari, quando nient'altro nella lingua funziona in questo modo? Non vedo alcun beneficio visibile a questa incoerenza linguistica.

risposta

17

La ragione alias funziona è perché si tratta di una parola chiave Ruby, simile a class, def, ecc Non è un metodo.

La parola chiave alias non richiede una virgola perché i progettisti di Ruby hanno deciso di non farlo. Le parole chiave sono essenzialmente codificate nell'interprete.

C'è una buona ragione per alias quando è necessario assicurarsi che l'alias avvenga in fase di analisi, non in fase di esecuzione.

La parola chiave alias può essere fonte di confusione o di sorpresa. Per lo sviluppo tipico, credo sia preferibile utilizzare il metodo Ruby Module#alias_method, che utilizza una virgola e funziona in fase di runtime.

Here's a good blog post circa alias e alias_method:

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

Nel complesso la mia raccomandazione sarebbe quella di utilizzare alias_method. Dal alias_method è un metodo definito nella classe Module che può essere sostituito in seguito da e offre maggiore flessibilità.

+1

Quindi, poiché si tratta di una parola chiave, è consentita una sintassi speciale che è codificata nell'interprete proprio in questo caso? Quel tipo di odori. –

+0

@Alex, sì, è hardcoded nell'interprete.C'è una buona ragione per alcune esigenze di programmazione perché puoi essere sicuro che l'alias avviene al momento della lettura, non in fase di runtime. – joelparkerhenderson

+0

@AlexWayne: Lo stesso si può dire della parola chiave 'else' o della parola chiave 'case'. Pensi davvero che sia un odore di design per le parole chiave avere le loro specifiche sintassi? Ti sfido a trovare qualsiasi linguaggio di programmazione di alto livello in cui nessuna parola chiave abbia la propria sintassi e tutti si comportano esattamente come le chiamate di metodo. – Jazz

7

Non è un metodo e questi non sono argomenti. alias è una delle poche parole chiave in Ruby (vederle tutte here!). Mi dà fastidio, quindi sono passato a alias_method (e ci sono other arguments for this).

Problemi correlati