Appenders and Arrays

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Sep 1 10:20:49 PDT 2015


On 9/1/15 12:49 PM, default0 wrote:
> Hello
>
> A simple thing I stumbled across:
>
> int main()
> {
>      import std.stdio;
>      import std.range;
>
>      int[] d;
>      d ~= 10;
>      d ~= 20;
>      d.put(5);
>      writeln(d);
>
>      return 0;
> }
>
> Appenders work fine as output ranges, but arrays do not. The above code
> prints "20" (ie the 10 is removed). Is "put" not supposed to mean
> "append one element"?

put into an slice does not append, it fills in the front. This is 
because the "target" of a slice is the data it points at.

Think of it as a buffer that you want to fill:

int[20] buf;
int[] outputRange = buf[];
outputRange.put(10);
outputRange.put(20);

assert(buf[0..2] == [10,20]);

> Further, while the following compiles fine but runs really odd, the
> following does not compile:
>
> int main()
> {
>      import std.stdio;
>      import std.range;
>
>      char[] c;
>      c ~= 'a';
>      c ~= 'b';
>      c.put('c');
>      writeln(c);
>
>      return 0;
> }
>
> C:\dmd\src\phobos\std\range.d(9,9): Error: static assert  "Cannot put a
> char into a char[]." (Test)
>
> I am puzzled by
> 1) Why I cannot put a char into a char[] (even though I can totally
> append them)

That seems like a bug. put has specific code to deal with putting 
characters into character ranges. Please file 
https://issues.dlang.org/enter_bug.cgi

-Steve


More information about the Digitalmars-d-learn mailing list