Moritz Warning:
> > foreach(key; aa.keys)
> > if(Test(key))
> > aa.remove(key);
>
> It's undefined behavior.
> You shouldn't try to mutate the aa while iterating.
> I hope that will be fixed.
> It took me some time to find this out.
In Python:
>>> d = {1:2, 3:4}
>>> for k in d: del d[k]
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
The "for k in d" sets a flag inside the d dict (AA), and del and insert
operations test this flag, if it's true a runtime exception is thrown.
Something like this is enough in Python, but I think in D it's not safe enough
and it may be a little slow too (because you have to test a flag every time).
In D a compile-time test pass may be able to catch and warn against most of
such situations (lint tools are able to do far more complex things).
--------------------
Christopher Wright
>Why not mandate using both keys and values?<
Iterating on tuples of an AA is probably a little slower than iterating on just
keys.
On the other hand such AAs will have something like xkeys and xvalues methods
too, that return light iterable objects (ranges, the first one has a O(1)
opIn_r, while the opIn_r of the second is O(n)) that are enough to regain the
lost performance when you need only keys or values, so this situation can
become acceptable.
Bye,
bearophile