I have an array that I want to iterate over and delete some of the elements. This doesn't work:
a = [1, 2, 3, 4, 5]
a.each do |x|
next if x < 3
a.delete x
# do something with x
end
a #=> [1, 2, 4]
I want a
to be [1, 2]
. How can I get around this?
Another way to do it is using
reject!
, which is arguably clearer since it has a!
which means "this will change the array". The only difference is thatreject!
will returnnil
if no changes were made.or
will both work fine.
I asked this question not long ago.
Deleting While Iterating in Ruby?
It's not working because Ruby exits the
.each
loop when attempting to delete something. If you simply want to delete things from the array,delete_if
will work, but if you want more control, the solution I have in that thread works, though it's kind of ugly.You don't have to delete from the array, you can filter it so:
a.delete_if { |x| x >= 3 }
See method documentation here
Update:
You can handle x in the block: