Modifying an associative array argument not passed by ref
Nick Treleaven
nick at geany.org
Sat Mar 8 12:02:41 UTC 2025
On Saturday, 8 March 2025 at 11:46:50 UTC, Anonymouse wrote:
> int[int] aa2;
> assert(0 !in aa2);
> modifyNoRef(aa2);
> assert(0 in aa2);
>
> int[int] aa3;
> const key = aa3.uniqueKey;
> assert(key in aa3); // <--
> }
>
> ```
>
> The `key in aa3` assert fails unless I make `uniqueKey` take
> its argument by ref. But `modifyNoRef` manages just fine
> without it. They work on the same type and they're all
> templates. The AAs they are passed have not been assigned any
> prior values.
>
> What is the deciding difference between those two functions?
`assert(0 in aa2)` actually fails too.
When an AA is null, it must be passed by ref to modify it. Once
it is non-null, its keys and values can be modified. But even a
non-null AA cannot be reassigned by passing it without ref.
Note that an AA can be constructed using `new` before passing by
value. See:
https://dlang.org/spec/hash-map.html#construction_and_ref_semantic
More information about the Digitalmars-d-learn
mailing list