2009-11-21 5 views
74

J'apprends juste Ruby alors excuses si c'est trop novice pour ici, mais je ne peux pas travailler cela à partir du livre pioche (probablement juste ne pas lire assez soigneusement). Quoi qu'il en soit, si j'ai un tableau comme ceci:Comment est-ce que je peux modifier un tableau pendant que je l'itère sur Ruby?

arr = [1,2,3,4,5] 

... et je veux, par exemple, il faut multiplier chaque valeur dans le tableau par 3, j'ai travaillé que faire ce qui suit:

arr.each {|item| item *= 3} 

... ne m'aura pas ce que je veux (et je comprends pourquoi, je ne modifie pas le tableau lui-même). Ce que je ne comprends pas, c'est comment modifier le tableau d'origine depuis l'intérieur du bloc de code après l'itérateur. Je suis sûr que c'est très facile.

Répondre

118

Utilisez map pour créer un nouveau tableau de l'ancien:

arr2 = arr.map {|item| item * 3} 

Utilisez map! pour modifier le tableau en place:

arr.map! {|item| item * 3} 

voir travailler en ligne: ideone

+2

Si vous avez vraiment besoin de modifier chaque élément, l'utilisation de la carte serait certainement plus élégante, à mon avis. – fresskoma

+2

Et si vous voulez modifier le tableau lui-même, utilisez map! –

16

Pour directement modifier le tableau, utilisez arr.map! {|item| item*3}. Pour créer un nouveau tableau basé sur l'original (ce qui est souvent préférable), utilisez arr.map {|item| item*3}. En fait, je pense toujours à deux fois avant d'utiliser each, parce que généralement il y a une fonction d'ordre supérieur comme map, select ou inject qui fait ce que je veux.

+0

Que faire si vous ne voulez pas effectuer une opération d'énumération? Que faire si vous voulez juste faire quelque chose comme 'arr.map! {Destructive_op}' pour changer définitivement 'arr'? –

+1

@TrevorAlexander: Je ne suis pas sûr de ce que vous voulez dire. Il pourrait être utile de poser comme une vraie question avec des détails et d'autres choses. – Chuck

+0

Je vais devoir y penser. A part la modification d'éléments très étroite, quelles opérations destructrices sur les structures ne sont pas énumérables? –

5
arr.collect! {|item| item * 3} 
Questions connexes