From: Farrel Lifson Date: 2007-03-09T05:49:51+09:00 Subject: Re: Looping through array, deleting elements On 08/03/07, dkmd_nielsen wrote: > My idea of looping through an array, interrogating elements that are > of class instruction, and deleting the element does not appear to work > as I thought. I think I know why. What is the best solution? > > block.each {|i| ab.delete(i) if i.parm == "FOO"} > > where block is a series of elements of class instruction(i). Class > instruction has two attributes, parm and arg. If the instruction parm > is FOO, then delete the instruction object from the array and keep > looping. Half of what should be deleted actually get's deleted. I > think the reason is: the loop is looking at element x foo, element x > foo get's deleted, the array is shifted left, array pointer has not > changed but is now referencing element y foo, loop advances the array > pointer, and now array pointer is pointing at element z foo. > > If what I think is correct, what is the best solution? Do I set the > current element to nil, then compact the array after the loop? Do I > delete the instruction and then do a redo? Or is there a better > solution than those? > > Thanks, > dvn This sounds like it would be a lot easier with Array#reject or Array#select.