How do I modify an array while I am iterating over it in Ruby?

brad picture brad · Nov 21, 2009 · Viewed 63.4k times · Source

I'm just learning Ruby so apologies if this is too newbie for around here, but I can't work this out from the pickaxe book (probably just not reading carefully enough). Anyway, if I have an array like so:

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

...and I want to, say, multiply each value in the array by 3, I have worked out that doing the following:

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

...will not get me what I want (and I understand why, I'm not modifying the array itself).

What I don't get is how to modify the original array from inside the code block after the iterator. I'm sure this is very easy.

Answer

Mark Byers picture Mark Byers · Nov 21, 2009

Use map to create a new array from the old one:

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

Use map! to modify the array in place:

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

See it working online: ideone