On 03/04/2011 05:43 PM, Steven Schveighoffer wrote:
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.

opApply should work but it is supposed to be slower.
Defining range primitives directly on the object/container cannot work as of now, unfortunately, because of a pair of bugs (conflicts in formatValue template definitions between struct/class on one hand and ranges on the other).

Denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to