std.range.put?
Steven Schveighoffer
schveiguy at yahoo.com
Wed May 23 13:27:51 PDT 2012
On Mon, 21 May 2012 07:26:32 -0400, simendsjo <simendsjo at gmail.com> wrote:
> Shouldn't the following work?
>
> import std.range;
> import std.stdio;
>
> void main() {
> int[] a;
> a.reserve(10);
> //a.put(1); // Attempting to fetch the front of an empty array of
> int
> a.length = 1;
> writeln(a.length); // 1
> a.put(2);
> writeln(a.length); // 0 - what?
> writeln(a); // [] - come on!
OK, here is why:
put(R, v) has three modus operandi:
1. R is an input range with an lvalue front().
2. R is a function/delegate that accepts a v
3. R implements the method put(v)
slices fit into category one. In this case, guess what happens?
R.front = v;
R.popFront();
Why? Think of R as a *buffer* that is *pre-allocated* and needs to be
filled. This is what put is trying to do.
What you want is std.array.Appender, which defines the method put, which
*appends* data to the end instead of overwriting it.
> char[] b;
> //b.put('a'); // range.d(615): Error: static assert "Cannot put a
> char into a char[]"
> }
This is just phobos being its usual nasty self claiming that char[] is not
an array of char, but actually a range of dchar. If I only had a nickel
every time someone ran into this "feature"... I'd probably have about $5
by now ;) It's one of the worst designs of Phobos.
-Steve
More information about the Digitalmars-d-learn
mailing list