On Mon, 21 May 2012 07:26:32 -0400, simendsjo <[email protected]> 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