byChunk odd behavior?
cym13 via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Mar 23 12:07:34 PDT 2016
On Wednesday, 23 March 2016 at 03:17:05 UTC, Hanh wrote:
> Thanks for your help everyone.
>
> I agree that the issue is due to the misusage of an InputRange
> but what is the semantics of 'take' when applied to an
> InputRange? It seems that calling it invalidates the range; in
> which case what is the recommended way to get a few bytes and
> keep on advancing.
Doing *anything* to a range invalidates it (or at least you
should expect it to), a range is read-once. Never reuse a range.
Some ranges can be saved in order to use a copy of it, but never
expect a range to be implicitely reusable.
> For instance, to read a ushort, I use
> range.read!(ushort)()
> Unfortunately, it reads a single value.
>
> For now, I use a loop
>
> foreach (element ; range.enumerate) {
> buffer[i] = range.front;
> range.popFront();
> }
>
> Is there a more idiomatic way to do the same thing?
Two ways, the first one being for reference:
import std.range: enumerate;
foreach (element, index ; range.enumerate) {
buffer[index] = element;
}
And the other one
> In Scala, 'take' consumes bytes from the iterator. So the same
> code would be
> buffer = range.take(N).toArray
Then just do that!
import std.range, std.array;
auto buffer = range.take(N).array;
auto example = iota(0, 200, 5).take(5).array;
assert(example == [0, 5, 10, 15, 20]);
More information about the Digitalmars-d-learn
mailing list