Eventuali duplicati:
What does map(&:name) mean in Ruby?Che cosa significa Post.all.map (&: id)?
Post.all.map(&:id)
tornerà
=> [1, 2, 3, 4, 5, 6, 7, ................]
Cosa map(&:id)
significa? Soprattutto lo &
.
Eventuali duplicati:
What does map(&:name) mean in Ruby?Che cosa significa Post.all.map (&: id)?
Post.all.map(&:id)
tornerà
=> [1, 2, 3, 4, 5, 6, 7, ................]
Cosa map(&:id)
significa? Soprattutto lo &
.
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.
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
@ sepp2k: Sì, ho dimenticato un '&' lì. –
La prima frase dovrebbe anche leggere qualcosa come "' & x' è la stessa di '& x.to_proc'" - eccetto che la definizione è infinitamente ricorsiva. – sepp2k
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.
È un trucco Ruby, che si basa su Ruby che esegue alcune conversioni di tipo dinamico. È possibile trovare una spiegazione di Symbol#to_proc trick here.
& significa che si sta passando un blocco
POST.All è il ricevitore del metodo MAP, e il suo blocco sarà trasmessa
Post.all.map { |item| # do something }
http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map
Si itera l'array e creare un lambda con il simbolo # to_proc
grazie per chiuso come duplicato esatto. Questa domanda è un po 'difficile per la ricerca. Scusate. –