Modifying an associative array argument not passed by ref

Ali Çehreli acehreli at yahoo.com
Mon Mar 10 00:06:35 UTC 2025


On 3/8/25 4:14 AM, Anonymouse wrote:
 > On Saturday, 8 March 2025 at 12:02:41 UTC, Nick Treleaven wrote:
 >> `assert(0 in aa2)` actually fails too.
 >
 > So it does! My bad. It makes more sense now.
 >
 >> 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
 >
 > I'll try that, thanks.

To complete the story, it is the same with arrays:

void main() {
     int[] arr;
     addElement(arr);

     // This array is not affected.
     assert(arr is null);    // Passes
}

void addElement(int[] arr) {
     // Only this local array is initialized.
     arr ~= 42;
}

Ali



More information about the Digitalmars-d-learn mailing list