Treating a slice as an InputRange
unleashy
lakeavenger at gmail.com
Wed Nov 15 22:48:12 UTC 2017
Thanks for the insights everyone, it really helped!
I actually discovered that it wasn't working because one of the
parsing functions used `std.range.take` and, since I was giving
it a slice, `take` decided to save the fwdrange instead of
mutating it. I realised the `take` call was 100% useless, so I
removed it and it works perfectly now, and refactored to be more
idiomatic :)
On Wednesday, 15 November 2017 at 21:02:35 UTC, Jonathan M Davis
wrote:
> If you specifically want a function to accept a range and
> mutate it without returning it, then it should take its
> argument by ref. Having it take auto ref is actually quite odd,
> since that means that the behavior can depend on whether an
> lvalue or rvalue is passed in.
I was under the impression that templated parameters needed `auto
ref` to work as `ref` properly. Good to know that's not true.
On Wednesday, 15 November 2017 at 21:11:16 UTC, Steven
Schveighoffer wrote:
>I'd model your functions after the std.conv.parse functions:
>
>https://dlang.org/phobos/std_conv.html#parse
>
>This always takes the range by reference, and takes the type to
>parse via a template parameter (more idiomatic D to have
>parse!int than parseInt).
Yes, that is much more idiomatic than what I was going for. I've
been writing some Java, so I guess it got to my head :)
On Wednesday, 15 November 2017 at 21:14:04 UTC, Ali Çehreli wrote:
>That should work:
>
>import std.range;
>
>T read(T, Range)(auto ref Range range) if (isInputRange!Range) {
> range.popFront();
> return 42;
>}
>
>unittest {
> ubyte[] slice = [ 1, 2 ];
> read!int(slice);
> assert(slice == [2]);
>}
>
>void main() {
>}
That is exactly what I was looking for, thanks!
More information about the Digitalmars-d-learn
mailing list