2012-02-27 18 views

risposta

73

Il simbolo & viene usato per indicare che il seguente argomento deve essere trattato come il blocco specificato al metodo. Ciò significa che se non è ancora un oggetto Proc, verrà chiamato il suo metodo to_proc per trasformarlo in uno.

Così, il vostro esempio i risultati in qualcosa di simile

Post.all.map(&:id.to_proc) 

che a sua volta equivale a

Post.all.map { |x| x.id } 

Così itera sulla raccolta restituita da Post.all e si accumula un array con il risultato di il metodo id ha richiamato ogni elemento.

Questo funziona perché Symbol#to_proc crea un processo che prende un oggetto e chiama il metodo con il nome del simbolo su di esso. Viene principalmente utilizzato per comodità, per risparmiare un po 'di digitazione.

+5

Questo non è vero. map (: id.to_proc) genererà un ArgumentError perché map non accetta argomenti. Passare un Proc come argomento è ** non ** uguale a fornire un blocco. Ciò che '&' fa è che trasforma un Proc in un blocco e se l'operando non è un Proc chiama prima to_proc e poi trasforma il risultato in un blocco. – sepp2k

+0

@ sepp2k: Sì, ho dimenticato un '&' lì. –

+0

La prima frase dovrebbe anche leggere qualcosa come "' & x' è la stessa di '& x.to_proc'" - eccetto che la definizione è infinitamente ricorsiva. – sepp2k

1

Questo prende tutti gli oggetti Post e crea una matrice con il metodo id invocato su ciascuno di essi.

In altre parole, per ActiveRecord, questo significa che si stanno ottenendo un allineamento con l'attributo id per tutti Post entità nel database.