Alle gioved8 marzo 2007, dkmd_nielsen ha scritto: > 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 I'm not sure I understand your code (what is that ab in the each block?) At any rate, there's method which directly deletes the elements of an array which satisfy a given condition: Array#delete_if: a=[1,2,3,4,5,6] a.delete_if{|i| i > 3} => [1,2,3] This method passes each element of the array to the block, then deletes it if the block returns true. Stefano