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