On Sunday, 11 May 2014 at 15:22:29 UTC, John Colvin wrote:
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);
}

There are problems with the implementation of associative arrays. What you are seeing above is a consequence of the associative array not being correctly initialised (I think...).

I often create my associative arrays with the following function to avoid the problem you're having:

/// Hack to properly initialise an empty AA
auto initAA(T)()
{
        T t = [typeof(T.keys[0]).init : typeof(T.values[0]).init];
        t.remove(typeof(T.keys[0]).init);
        return t;
}

import std.stdio;

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

void main() {
    int[int] d = initAA!(int[int]);
    test(d, 0);
    writeln(d);
}

OK. :-)
That makes it difficult to talk about in a classroom, especially when trying to stress
adherence to the principle of least surprise.
Thanks very much for the quick reply.

Reply via email to