digitalmars.D.learn - Why does std.container.array does not work with foraech( i, a; array )
- ParticlePeter (4/4) May 29 2016 Which of the op(Index) operators is responsible for enabling this
- Jonathan M Davis via Digitalmars-d-learn (22/26) May 29 2016 std.container.array.Array works with foreach via ranges.
- Mithun Hunsur (3/28) May 29 2016 I'd say that std.range.enumerate is more indicative of intent:
- ParticlePeter (12/42) May 29 2016 Thanks, due to your answer I found a way which is even better for
Which of the op(Index) operators is responsible for enabling this kind of syntax? Would it be possible to get it work with UFCS or would I have to wrap the array?
May 29 2016
On Sunday, May 29, 2016 07:14:12 ParticlePeter via Digitalmars-d-learn wrote:Which of the op(Index) operators is responsible for enabling this kind of syntax? Would it be possible to get it work with UFCS or would I have to wrap the array?std.container.array.Array works with foreach via ranges. foreach(e; myContainer) { } gets lowered to foreach(e; myContainer[]) { } which in turn gets lowered to something like for(auto r = myContainer[]; !r.empty; r.popFront()) { auto e = r.front; } Ranges do not support indices with foreach, and that's why you're not able to get the index with foreach and Array. However, if you use std.range.lockstep, you can wrap a range to get indices with foreach. e.g. foreach(i, e; lockstep(myContainer[])) { } - Jonathan M Davis
May 29 2016
On Sunday, 29 May 2016 at 09:07:07 UTC, Jonathan M Davis wrote:On Sunday, May 29, 2016 07:14:12 ParticlePeter via Digitalmars-d-learn wrote:I'd say that std.range.enumerate is more indicative of intent: http://dlang.org/phobos/std_range.html#enumerate[...]std.container.array.Array works with foreach via ranges. foreach(e; myContainer) { } gets lowered to foreach(e; myContainer[]) { } which in turn gets lowered to something like for(auto r = myContainer[]; !r.empty; r.popFront()) { auto e = r.front; } Ranges do not support indices with foreach, and that's why you're not able to get the index with foreach and Array. However, if you use std.range.lockstep, you can wrap a range to get indices with foreach. e.g. foreach(i, e; lockstep(myContainer[])) { } - Jonathan M Davis
May 29 2016
On Sunday, 29 May 2016 at 09:07:07 UTC, Jonathan M Davis wrote:On Sunday, May 29, 2016 07:14:12 ParticlePeter via Digitalmars-d-learn wrote:Thanks, due to your answer I found a way which is even better for me. I pimped the Array containers with some UFCS functions anyway, one of them returns the array data as a slice and this works nicely with that foreach variant as well auto data( T )( Array!T array ) { if( array.length == 0 ) return null; return (&array.front())[ 0..array.length ]; } // this works now foreach( i, a; someArrayContainer.data ) { ... } - PPWhich of the op(Index) operators is responsible for enabling this kind of syntax? Would it be possible to get it work with UFCS or would I have to wrap the array?std.container.array.Array works with foreach via ranges. foreach(e; myContainer) { } gets lowered to foreach(e; myContainer[]) { } which in turn gets lowered to something like for(auto r = myContainer[]; !r.empty; r.popFront()) { auto e = r.front; } Ranges do not support indices with foreach, and that's why you're not able to get the index with foreach and Array. However, if you use std.range.lockstep, you can wrap a range to get indices with foreach. e.g. foreach(i, e; lockstep(myContainer[])) { } - Jonathan M Davis
May 29 2016