On Monday, 8 June 2020 at 06:13:36 UTC, mw wrote:

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 tried to change arrs' decl to:

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

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.

```
import std.stdio;

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

void main() {
        import std.algorithm;
        
        int[]*[] arrs;
        int[]* arr;
        foreach (i; 0 .. 3) {
//stack allocated array pointer&length would expire on end of scope, so must allocate the them on heap since we're keeping refeerences on them.
                auto arrayAllocation = new int[][1];
                arr = &arrayAllocation[0];
                *arr = new int[0];
                arrs ~= arr;
                f(*arr);
        }
        
        //will print an array of addresses otherwise
        arrs.map!(ptr => *ptr).writeln;
}
```

But I must say I would generally prefer just calling `f()` on `arrs[i]` directly after appending, or calling the function before appending. One reason is that needless heap usage is generally less efficient than using the stack.

Reply via email to