Exception handling vs. hasNext()

Yuh-Ruey Chen maian330 at gmail.com
Sat Nov 17 01:14:55 PST 2007


More advantages to StopIteration:

1) There are some iterations in which calculating whether the next
iteration exists is non-trivial, such as iterating on trees.

2) While one could work around non-trivial hasNext() calculations by
"pre-advancing" the iterator, i.e. if an iterator has returned the i-th
item, it has already calculated the (i+1)-th item, making hasNext()
simply check if the (i+1)-th item exists, such an approach is not only
less efficient, but won't work if the iterator makes side effects.

3) Repeated hasNext() checks can be slower than throwing and catching a
StopIteration, especially if the compiler is optimized to expect that
StopIteration from an iterator.

4) Iterator-generators hide the messy business of StopIteration:

// range is an iterator-generator (note the yield statement)
function range(len) {
    for (let i = 0; i < len; ++i)
       yield i;
}

for (let x in range(10))
    print(x);

No mention of StopIteration - or even next() - anywhere in that code yet
|range(10)| is clearly an iterator.

In case you were wondering, ES4's iteration protocol is heavily inspired
from Python, and I think Python has handled this iteration business very
well.

-Yuh-Ruey Chen

Erik Arvidsson wrote:
> One benefit of StopIteration is that code inside map/some/every etc
> can just throw a StopIteration to stop the iteration.  The same thing
> is harder to keep clean with a hasNext/next pattern.
>   



More information about the Es4-discuss mailing list