Overriding iteration

Steven Schveighoffer schveiguy at yahoo.com
Fri Mar 4 08:43:07 PST 2011


On Fri, 04 Mar 2011 11:29:08 -0500, Magnus Lie Hetland  
<magnus at hetland.org> wrote:

> From what I understand, when you override iteration, you can either  
> implement the basic range primitives, permitting foreach to  
> destructively iterate over your object, or you can implement a custom  
> method that's called, and that must perform the iteration. The  
> destructiveness of the first option can, of course, be mitigated if you  
> use a struct rather than a class, and make sure that anything that would  
> be destroyed by popFront() is copied.
>
> What I'm wondering is whether there is a way to do what Python does --  
> to construct/return an iterator (or, in this case, a range) that is used  
> during the iteration, rather than the object itself?

That's exactly how to do it.

>
> I'm thinking about when you iterate directly over the object here. As  
> far as I can see, the solution used in the std.container is to use  
> opSlice() for this functionality. In other words, in order to iterate  
> over container foo, you need to use foreach(e; foo[])? Is there no way  
> to get this functionality directly (i.e., for foreach(e; foo))?

I believe someone has filed a bug for this, because TDPL has said this  
should be possible.

But with the current compiler, you can use opApply to achieve that  
behavior.

-Steve


More information about the Digitalmars-d-learn mailing list