Comment puis-je modifier un tableau alors que je l’itère dans Ruby?

J’apprends juste que Ruby s’excuse si cela est trop récent, mais je ne peux pas résoudre ce problème avec le livre de pioche (probablement ne pas lire suffisamment). En tout cas, si j’ai un tableau comme ça:

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

… et je veux, par exemple, multiplier chaque valeur du tableau par 3, j’ai fait 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 à partir du bloc de code après l’iterator. Je suis sûr que c’est très facile.

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

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

Utilisez la map! modifier le tableau en place:

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

Voir ça marche en ligne: ideone

Pour modifier directement le tableau, utilisez arr.map! {|item| item*3} arr.map! {|item| item*3} 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} arr.map {|item| item*3} . En fait, je réfléchis toujours à deux fois avant de les utiliser, car il y a généralement une fonction d’ordre supérieur, comme map , select ou inject qui fait ce que je veux.

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