On Sunday, 11 May 2014 at 14:46:35 UTC, rbutler wrote:
I have searched and can not understand something about passing AAs to a function.
I have reduced the gist of the question to a tiny program below.
If I put "ref"  in the function stmt it works, i.e.:
        ref int[int] aa
My confusion is that AAs are supposed to be passed as refs anyway, so I do
not understand why I should have to use ref to make it work.

Related, it also works if I UN-comment the line    d[9] = 9;

Thanks for any helpful comments you can make.
--rbutler

import std.stdio;

void test(int[int] aa, int x) {
    aa[x] = x;
    aa[8] = 8;
}

void main() {
    int[int] d;
    writeln(d.length);
    // d[9] = 9;
    test(d, 0);
    writeln(d);
}

The AA is passed by value but its underlying data is referenced, making the copy cheap. The snippet below also shows the same behaviour even when the AA has data in it before calling the function.
---
void func(string[int] aa)
{
    writefln("[FUNC1]    &aa:%s=%s", &aa, aa);

    // Reassign the data here in func()'s copy and
    // main never sees it
    aa = [2:"two"];
    writefln("[FUNC2]    &aa:%s=%s", &aa, aa);

}

void main()
{
    string[int] aa;
    aa[1] = "one";
    writefln("[MAIN1]    &aa:%s=%s", &aa, aa);
    func(aa);
    writefln("[MAIN2]    &aa:%s=%s", &aa, aa);

}
---

It is the same as passing a C++ shared_ptr<> by value.

Cheers,
ed

Reply via email to