On Thu, Apr 2, 2015 at 8:22 AM, Peter Uhn��k <i.uhnak@gmail.com> wrote:
Hi,

I've just run into quite a nasty surprise
~~~~~~~~~~~~~~~~
col := #(1 2 3 4 5) asOrderedCollection.
col do: [ :each | col remove: each. ].
col
~~~~~~~~~~~~~~~~
it throws "NotFound: nil not found in OrderedCollection"
I tested it also in Pharo3 and there it just silently removed first, third and fifth element.

Looking at the implementation of OrderedCollection>>do: ��it seems that doing what I'm doing is a bad idea.

So what shall one do:? col copy do: [...] ?

Yes, as a general rule, do not modify a collection you are iterating on, so, doing col copy do: looks right.��

removeAllSuchThat: aBlock��
"Evaluate aBlock for each element and remove all that elements from
the receiver for that aBlock evaluates to true.�� Use a copy to enumerate��
collections whose order changes when an element is removed (i.e. Sets)."

self copy do: [:each | (aBlock value: each) ifTrue: [self remove: each]]

If the collection is huge, that can be an issue.


Why can't do: be a bit smarter? Optimization?

If you have the group of things to remove you can do��

aCollection removeAll: anotherCollection

Phil
��

Thanks,
Peter



��