On Thursday, 9 January 2020 at 10:26:07 UTC, Jonathan M Davis
wrote:
On Wednesday, January 8, 2020 10:56:20 PM MST rikki cattermole
via Digitalmars-d-learn wrote:
Slicing via the opSlice operator overload is a convention, not
a requirement.
It's not a requirement, but it's more than a convention. If you
use the container with foreach, the compiler will call opSlice
on the container to get a range. So, there's no need to
implement opApply to iterate over a container with foreach. You
could choose to implement a container with opApply and use a
function other than opSlice for getting a range, but the
compiler understands enough to try to slice the container for
you automatically when using it with foreach.
- Jonathan M Davis
Implementing opApply allowed me to use foreach on the container.
I would expect that returning a slice would not be logically
possible for many container types. A slice cannot be a range
either, otherwise you would need to call the array algorithm to
assign a slice of an array to another array.
So the compiler must be creating a forward iterating range to
pass into the range algorithms in these cases.
That foreach, and range algorithms can work on a native array but
only foreach can work on custom container type looks like a gap
in the language.