how to append (ref) int[] to int[][]?

mw mingwu at gmail.com
Mon Jun 8 06:13:36 UTC 2020


Hi,

I have this program:
----------------------------------------------------
import std.stdio;

void f(ref int[] arr) {
         arr ~= 3;
}

void main() {
         int[][] arrs;
         int[] arr;
         foreach (i; 0 .. 3) {
                 arr = new int[0];
                 arrs ~= arr; //(a) [[], [], []]
                 f(arr);
                 // arrs ~= arr; //(b) [[3], [3], [3]]
         }

         writeln(arrs);
}
----------------------------------------------------

This program will print out [[], [], []].

If I comment out (a), and use (b), it will print out [[3], [3], 
[3]]

So based on this behavior, looks like "~=" will append a copy of 
`arr`; but what I really want in (a) is append `ref arr` and 
output [[3], [3], [3]], i.e. the real `arr` be appended instead 
of its copy.

I have to say this semantics surprised me.

I tried to change arrs' decl to:

     (ref (int[]))[] arrs;  // the intended semantics I want

But I got compiler error out: "found ( when expecting function 
literal following ref".

1) I'm wondering how to achieve what I want? and
2) why "~=" here will append a copy rather than the real `arr` 
itself to arrs?


Thanks.



More information about the Digitalmars-d-learn mailing list