When are associative arrays meant to throw a RangeError?
yebblies at nospamgmail.com
Fri Feb 17 19:19:22 PST 2012
It's 3. It also has the nasty side effect that throwing while evaluating
the rhs leaves the AA with a default-initialized key.
When AA[key] needs to be an lvalue, it gets translated to something like:
which creates the key if it doesn't exist and returns a reference to it.
"Ben Davis" <entheh at cantab.net> wrote in message
news:jhn2e7$2urh$1 at digitalmars.com...
>I can't easily see what the rules are. Specifically, I'm finding:
> Chunk[char] chunks;
> //chunks["DATA"] is an array of Chunk objects, where Chunk is a class.
> //I'm using this structure to remember positions of chunks in a file
> //These both work:
> chunks["AAAA"]~=new Chunk();
> chunks["BBBB"]=chunks["BBBB"]~new Chunk();
> //These all throw RangeErrors
> Chunk tempVar=chunks["CCCC"]~new Chunk();
> if (chunks["DDDD"].length!=1) throw new Exception("");
> //This works and formats the null as ""
> So, as far as I can tell, chunks[nonexistentKey] throws a RangeError in
> most cases, including with ~ in general, but not if the ~ is used for an
> in-place modification.
> My initial expectation would be that every example above would throw a
> RangeError (except the one that doesn't use 'chunks' at all).
> So here are my theories, in the approx order I came up with them:
> 1=. It's an optimisation accident, and it's meant to throw.
> 1=. It's a nasty bodge specifically to make assoc arrays usable with
> modify-assign expressions.
> 3. It could be a quirk of assignment expression evaluation order. Perhaps
> the assignment expression FIRST creates an entry in the assoc array using
> the value type's default value (an empty dynamic array), AND THEN
> evaluates the RHS, which is able to read the empty array that's just been
> Whatever the case, I couldn't find any documentation on the subject. I
> looked under associative arrays (obviously), and also under assignment
> expressions, and also under expression statements just for good measure.
> Would appreciate any comments :)
> Ben :)
More information about the Digitalmars-d