Overriding iteration

spir denis.spir at gmail.com
Fri Mar 4 09:13:34 PST 2011


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

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



More information about the Digitalmars-d-learn mailing list