2010-08-11 10 views
5

Ho visto un frammento di codice rubino oggi.Come funziona questa magia di iniezione di rubino?

[1,2,3,4,5,6,7].inject(:+) 

=> 28

[1,2,3,4,5,6,7].inject(:*) 

=> 5040

L'iniezione qui è molto diverso da quelli che ho visto prima, come

[1,2,3,4,5,6,7].inject {|sum, x| sum + x} 

Spiegare come funziona?

+0

Non so se c'è un nome speciale per questo (se si desidera google per esso), diverso da 'Symbol # to_proc'. –

risposta

6

Non c'è magia, il simbolo (metodo) è solo uno dei parametri possibili. Questo è dai documenti:

# enum.inject(initial, sym) => obj 
    # enum.inject(sym)   => obj 
    # enum.inject(initial) {| memo, obj | block } => obj 
    # enum.inject   {| memo, obj | block } => obj 

Il nostro caso è il secondo.

Si può anche riscrivere con il blocco tradizionale:

op = :+ # parameter of inject call 
[1,2,3,4,5,6,7].inject {|sum, x| sum.send(op, x)} # also returns 28 

(per rispondere "come funziona" parte)

+0

Impossibile trovare informazioni sul simbolo come parametri qui, http://ruby-doc.org/core/classes/Enumerable.html. Il documento è troppo vecchio ... –

+0

@Zifei Questo è il collegamento alla versione 1.8.6. Controlla http://ruby-doc.org/ per i collegamenti ad altre versioni, sezione API core –

+1

Scarica, http://ruby-doc.org/core-1.8.7/classes/Enumerable.html. Grazie. –

1

Come si può vedere in the docs, inject può prendere un blocco (come te' familiarità con) o un simbolo che rappresenta il nome di un operatore binario. È una utile stenografia per le operazioni già definite.

+1

Grazie, ruby ​​1.9 è dolce :) –

3

Il: + è un symbol che rappresenta il messaggio di aggiunta. Ricorda che Ruby ha uno stile Smalltalk in cui praticamente ogni operazione viene eseguita inviando un messaggio a un oggetto.

Come discusso in dettaglio here, (1..100).inject(&:+) è una sintassi valida nelle versioni precedenti in cui Rails ha aggiunto l'estensione to_proc a Symbol.

La possibilità di passare solo un simbolo per iniettare era nuova in 1.9 e backported into 1.8.7.

+0

E infatti questa tecnica è conosciuta come "il (in) famoso Simbolo >> valore: hack" (http://blog.3plus4.org/2007/03/27/selectors-as -blocchi /) nella comunità Smalltalk: '(1..100) riduci: # +' –

Problemi correlati