How to update Associative Array?

kdevel kdevel at vogtner.de
Sat Feb 12 21:37:40 UTC 2022


On Thursday, 10 February 2022 at 17:09:23 UTC, Ali Çehreli wrote:
> import std.traits : isAssociativeArray, 
> isImplicitlyConvertible, KeyType, ValueType;
>
> void update(Target, From)(ref Target target, From from)
> if (isAssociativeArray!Target &&
>     isAssociativeArray!From &&
>     isImplicitlyConvertible!(KeyType!From, KeyType!Target) &&
>     isImplicitlyConvertible!(ValueType!From, ValueType!Target))
> {
>   foreach (kv; from.byKeyValue) {
>     target[kv.key] = kv.value;
>   }
> }

[...]

> Yes, it may look scary to newcomers to D but the template 
> constraint is just for improved usability.

It also looks scary to me and I use D now for quite a while. 
Assume I have this client code:

    string[int] q;
    byte[short] r;
    q.update (r);

It produces this error message from your version:

    $ dmd -checkaction=context -unittest -run v1
    v1.d(21): Error: template `v1.update` cannot deduce function 
from argument types `!()(string[int], byte[short])`
    v1.d(3):        Candidate is: `update(Target, From)(ref Target 
target, From from)`
      with `Target = string[int],
           From = byte[short]`
      must satisfy the following constraint:
    `       isImplicitlyConvertible!(ValueType!From, 
ValueType!Target)`

If I remove the constraint (the if-stuff) I get

    v1.d(12): Error: cannot implicitly convert expression 
`kv.value()` of type `byte` to `string`
    v1.d(23): Error: template instance `v1.update!(string[int], 
byte[short])` error instantiating

Can this really be improved?

Stefan


More information about the Digitalmars-d-learn mailing list