On Fri, 04 Mar 2011 11:29:08 -0500, Magnus Lie Hetland <mag...@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

Reply via email to