Passing a reference to a returned reference

Michael michael at toohuman.io
Fri Jul 6 14:31:50 UTC 2018


On Friday, 6 July 2018 at 14:11:42 UTC, Timoses wrote:
> On Friday, 6 July 2018 at 13:13:43 UTC, Michael wrote:
>> static auto ref consensus( ... )
>
> `auto ref` infers the return type from the return statement 
> [1]. So it's not necessarily returning a ref type.
>
> However, I don't think this matters if the only concern you 
> have is that the setter function actually modifies the passed 
> object.
>
>>
>> and the agent's setter method looks like the following:
>>
>> void beliefs(ref double[int] beliefs)
>>
>> Now obviously if I remove ref in the above signature, 
>> everything works fine, but I am surprised I wasn't getting any 
>> kind of warning about the reference because the setter 
>> function just doesn't run at all. I tried checking if (beliefs 
>> is null) but perhaps this isn't the correct way to check if an 
>> associative array's reference is no longer reachable?
>>
>> Some explanation would be great, thanks!
>
> This works for me:
>
>     auto create()
>     {
>         string[int] dict;
>         dict[2] = "hello";
>         return dict;
>     }
>
>     void modifyNoRef(string[int] m)
>     {
>          writeln("Address not ref: ", &m);
>          m[0] = "modified";
>     }
>
>     void modifyRef(ref string[int] m)
>     {
>          writeln("Address ref: ", &m);
>          m[1] = "modified";
>     }
>
>     unittest
>     {
>         auto r = create();
>         writeln("Address r: ", &r);
>         assert(r.keys.length == 1);
>         modifyNoRef(r);
>         assert(r.keys.length == 2);	
>         modifyRef(r);
>         assert(r.keys.length == 3);	
>     }
>
> So either with ref or not as parameter storage class the assoc. 
> array is modified. Note the address in the "ref" one is the 
> same as "r" in the unittest.
>
> [1]: https://dlang.org/spec/function.html#auto-ref-functions

Aah yes I had forgotten that I had set it as auto ref. However, 
even when I set that function to always return a copy of the 
associative array, it didn't change anything -- the issue always 
seems to be with the setter method expecting a reference.

So then, supposing it's returning a copy of the object. Given 
that my setter method was still expecting a reference, is there a 
reason why it doesn't even invoke the setter unless I change the 
parameter from expecting a reference to expecting a copy of the 
object? It's not like the function failed in any way, it just 
wouldn't run the function at all. Not even while I was printing 
something right at the top.


More information about the Digitalmars-d-learn mailing list