web-dev-qa-db-fra.com

Comment modifier un tableau pendant que je l'itère dans Ruby?

J'apprends juste Ruby donc je m'excuse si c'est trop novice pour ici, mais je ne peux pas travailler cela à partir du livre de pioche (probablement juste ne pas lire assez attentivement). Quoi qu'il en soit, si J'ai un tableau comme ça:

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

... et je veux, disons, multiplier chaque valeur du tableau par 3, j'ai calculé que faire ce qui suit:

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

... ne m'obtiendra 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 simple.

82
brad

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

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

Utilisation map! pour modifier le tableau en place:

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

Voyez-le travailler en ligne: ideone

128
Mark Byers

Pour modifier directement 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 réfléchis toujours à deux fois avant d'utiliser each, car il y a généralement une fonction d'ordre supérieur comme map, select ou inject qui fait ce que je veux .

17
Chuck
arr.collect! {|item| item * 3}
5
Jeff Richardson