Alias this with array can only be used once

Ali Çehreli acehreli at yahoo.com
Wed Feb 22 14:34:00 PST 2012


On 02/22/2012 02:16 PM, Blake Anderton wrote:
> Why doesn't this work? I'm assuming I'm not fully understanding how
> "alias this" interacts with ranges (i.e. the range isn't being reset
> after count is finished with it), but I'm not sure how to fix this either:
>
> import std.algorithm;
>
> class ArrayContainer
> {
> int[] values;
> this(int[] v) { values = v; }
> alias values this;
> }
>
> void main(string[] args)
> {
> auto c = new ArrayContainer([1, 2, 3]);
> assert(count(c) == 3); //succeeds
> assert(c.length == 3); //FAILS - is actually zero
> }

Consumption of the range is natural for an InputRange.

What I see in Phobos is that containers like ArrayContainer themselves 
don't behave like ranges, rather they hand out Range objects to be consumed.

As a solution, it can have a member function named something like 
elements() that returns a separate array to be used as an InputRange.

Ali


More information about the Digitalmars-d-learn mailing list