When are associative arrays meant to throw a RangeError?

Ben Davis entheh at cantab.net
Sat Feb 18 16:13:12 PST 2012


On 18/02/2012 23:33, Andrej Mitrovic wrote:
> Well it's probably too late to change this behavior. Both the sample
> on the hash page and TDPL itself shows the usage of that trick.

That's fine - but let's document it :)

A few things seem to be missing:

- You get a RangeError for reading a nonexistent key;

- However, you can safely write a[k]=a[k]+1 or a[k]++, because if a[k] 
doesn't exist, then a[k]=b sets a[k] to the default value first before 
evaluating b. (This is a special case for assoc array assignments, not 
for other assignments.)

- .init property for assoc arrays returns null.

- For dynamic arrays and assoc arrays, 'null' is an empty array, so you 
don't have to worry about null crashes like with objects.

Here are the tests I did to confirm the above:

writefln("%s",cast(int[string])null);
//prints "[]"

int[string] assoc=null;
writefln("%s",assoc.length);
//prints 0

writefln("%s",(cast(int[string])null).length);
//breaks the compiler for me :P but not an important use case

int[] dyn=null;
writefln("%s",dyn.length);
//prints 0

> Btw, if you really want Type.init if the key doesn't exist you can use
> the get method:
> Chunk[] tempVar = chunks.get("CCCC", null) ~ new Chunk();

Yes, good to know! I see it's in the docs too. Thanks :)


More information about the Digitalmars-d mailing list