Thread overview
foreach seems to work with opIndex()
Feb 06, 2016
Tofu Ninja
Feb 06, 2016
Tofu Ninja
Feb 06, 2016
anonymous
Feb 06, 2016
anonymous
Feb 06, 2016
H. S. Teoh
Feb 06, 2016
ZombineDev
Feb 06, 2016
H. S. Teoh
Feb 06, 2016
Tofu Ninja
February 06, 2016
Foreach seems to work if there is an opIndex() with no arguments that returns a range interface, is this documented? I can't seem to find anything that say this is supposed to happen. I am not really complaining, its nice, but I just didnt really expect it because I feel like I remember this being an error some time ago.
February 06, 2016
On Saturday, 6 February 2016 at 14:43:52 UTC, Tofu Ninja wrote:
> Foreach seems to work if there is an opIndex() with no arguments that returns a range interface, is this documented? I can't seem to find anything that say this is supposed to happen. I am not really complaining, its nice, but I just didnt really expect it because I feel like I remember this being an error some time ago.

To clerify, I was doing something like

struct someStruct{
     ...
     dchar[] opIndex(){
          if(data==null) return null;
          else return data.some_array;
     }
}
...
someStruct s;
foreach(c;s) {}

I expected to need to write
foreach(c;s[]) {}
February 06, 2016
On 06.02.2016 15:43, Tofu Ninja wrote:
> Foreach seems to work if there is an opIndex() with no arguments that
> returns a range interface, is this documented? I can't seem to find
> anything that say this is supposed to happen. I am not really
> complaining, its nice, but I just didnt really expect it because I feel
> like I remember this being an error some time ago.

https://issues.dlang.org/show_bug.cgi?id=14619
February 06, 2016
On Sat, Feb 06, 2016 at 02:43:52PM +0000, Tofu Ninja via Digitalmars-d-learn wrote:
> Foreach seems to work if there is an opIndex() with no arguments that returns a range interface, is this documented? I can't seem to find anything that say this is supposed to happen. I am not really complaining, its nice, but I just didnt really expect it because I feel like I remember this being an error some time ago.

Not really sure, but opIndex() with no arguments is supposed to be the current way of implement the [] slicing operator for user-defined types. I'm not sure when foreach started supporting that, but it's certainly a nice thing!


T

-- 
Nobody is perfect.  I am Nobody. -- pepoluan, GKC forum
February 06, 2016
On 06.02.2016 16:00, anonymous wrote:
> https://issues.dlang.org/show_bug.cgi?id=14619

Sorry, posted a bit hastily. Issue 14619 is just about a bug in the feature. The more relevant issue is number 5605:

https://issues.dlang.org/show_bug.cgi?id=5605

As far as I can tell, this is not documented on dlang.org. It should be, of course.

I personally think it's a misfeature. Explicit slicing is just two characters longer and makes it more clear what's happening.
February 06, 2016
On Saturday, 6 February 2016 at 15:02:16 UTC, H. S. Teoh wrote:
> On Sat, Feb 06, 2016 at 02:43:52PM +0000, Tofu Ninja via Digitalmars-d-learn wrote:
>> Foreach seems to work if there is an opIndex() with no arguments that returns a range interface, is this documented? I can't seem to find anything that say this is supposed to happen. I am not really complaining, its nice, but I just didnt really expect it because I feel like I remember this being an error some time ago.
>
> Not really sure, but opIndex() with no arguments is supposed to be the current way of implement the [] slicing operator for user-defined types. I'm not sure when foreach started supporting that, but it's certainly a nice thing!
>
>
> T

I thought that opSlice() was supposed to be that operator. At least this is what's used in std.container (e.g. http://dlang.org/phobos/std_container_array.html#.Array.opSlice).
February 06, 2016
On Saturday, 6 February 2016 at 15:02:16 UTC, H. S. Teoh wrote:
> Not really sure, but opIndex() with no arguments is supposed to be the current way of implement the [] slicing operator for user-defined types. I'm not sure when foreach started supporting that, but it's certainly a nice thing!
>
>
> T

It feels a little weird because none of the range functions like map support calling opIndex so you can omit the [] in foreach but not with map. Just feels inconsistent.
February 06, 2016
On Sat, Feb 06, 2016 at 03:11:22PM +0000, ZombineDev via Digitalmars-d-learn wrote:
> On Saturday, 6 February 2016 at 15:02:16 UTC, H. S. Teoh wrote:
> >On Sat, Feb 06, 2016 at 02:43:52PM +0000, Tofu Ninja via Digitalmars-d-learn wrote:
> >>Foreach seems to work if there is an opIndex() with no arguments that returns a range interface, is this documented? I can't seem to find anything that say this is supposed to happen. I am not really complaining, its nice, but I just didnt really expect it because I feel like I remember this being an error some time ago.
> >
> >Not really sure, but opIndex() with no arguments is supposed to be the current way of implement the [] slicing operator for user-defined types.  I'm not sure when foreach started supporting that, but it's certainly a nice thing!
> >
> >
> >T
> 
> I thought that opSlice() was supposed to be that operator. At least
> this is what's used in std.container (e.g.
> http://dlang.org/phobos/std_container_array.html#.Array.opSlice).

That's the old use of opSlice(), which is still supported for backward compatibility. The new use of opSlice, after Kenji's multidimensional array PR, is to translate x..y notation into a type that opIndex can understand. Namely, this:

	x[1, 2..3, 4, 5..6]

is translated into:

	x.opIndex(1, x.opSlice(2,3), 4, x.opSlice(5,6))


T

-- 
I am Ohm of Borg. Resistance is voltage over current.