2011-04-16 3 views
16

Eventuali duplicati:
Array#each vs. Array#mapIn che modo array.each e array.map sono diversi?

ruby-1.9.2-p180 :006 > ary = ["a", "b"] 
=> ["a", "b"] 
ruby-1.9.2-p180 :007 > ary.map { |val| p val } 
"a" 
"b" 
=> ["a", "b"] 
ruby-1.9.2-p180 :008 > ary.each { |val| p val } 
"a" 
"b" 
=> ["a", "b"] 

ruby-1.9.2-p180 :009 > ary.map { |val| val << "2" } 
=> ["a2", "b2"] 
ruby-1.9.2-p180 :010 > ary.each { |val| val << "2" } 
=> ["a22", "b22"] 

risposta

48

Il side effects sono gli stessi, che è l'aggiunta di una certa confusione al reverse engineering.

Si, sia iterare l'array (in realtà, tutto ciò che mixes in Enumerable), ma mappa restituirà un array composto dai risultati di blocco mentre ogni sarà solo restituire la matrice originale. Il valore restituito di ogni viene raramente utilizzato nel codice Ruby ma mappa è uno dei most important functional tools.

BTW, che possono avere un momento difficile trovare la documentazione perché mappa è un metodo in Enumerable mentre ogni (quello metodo richiesto dal modulo Enumerable) è un metodo in Array .

Come nota curiosità: la mappa attuazione si basa sul ogni.

+5

+1 per il collegamento di "mappa" alla programmazione funzionale. "each" invece è il solito ciclo imperativo con effetti collaterali. – tokland

+3

Quindi utile, grazie. –

+0

La mappa non sembra molto 'funzionale' perché la modifica dell'oggetto in questione cambia l'oggetto originale –

2

L'array # map è una raccolta di tutto ciò che viene restituito nel blocco per ciascun elemento.

N. di array ognuno esegue il blocco di codice per ciascun elemento, quindi restituisce l'elenco stesso.

Si dovrebbe controllare questo Array#each vs. Array#map

2

Ogni è solo un iteratore che ottiene l'elemento successivo di un iterabile e alimenta ad un blocco. La mappa viene utilizzata per iterare ma mappare gli elementi su qualcos'altro, come un valore moltiplicato per una costante. Nei tuoi esempi, possono essere usati in modo intercambiabile, ma ognuno è un iteratore più generico che passa l'elemento a un blocco.

7

definizione da documenti API: ciascuno: blocco chiamate una volta per ciascun elemento in sé, passando quell'elemento come parametro. map: invoca il blocco una volta per ogni elemento di sé. Crea un nuovo array contenente i valori restituiti dal blocco.

così ciascuno è un ciclo normale, che scorre attraverso ogni elemento e richiama dato blocco

mappa generalmente usato quando si desidera un altro array mappata certa logica esistente. È anche possibile passare il metodo come riferimento alla funzione mappa come

[1,2,3].map(&:to_s) 
Problemi correlati