"in" operator gives a pointer result from a test against an Associative Array?

Meta jared771 at gmail.com
Fri May 10 00:40:01 UTC 2024


On Friday, 10 May 2024 at 00:18:16 UTC, Andy Valencia wrote:
> tst7.d(6): Error: cannot implicitly convert expression `e in 
> this.members` of type `bool*` to `bool`
> tst7.d(15): Error: template instance `tst7.Foo!uint` error 
> instantiating
>
> I'm getting this for this bit of source (trimmed from the 
> bigger code).  I switched to this.members.get(e, false) and 
> that works fine, but I'm still curious:
>
> struct Foo(T) {
>     bool[T] members;
>
>     bool
>     has(T e) {
>         return (e in this.members);
>     }
> }
>
> void
> main()
> {
>     import std.stdio : writeln;
>
>     auto t = Foo!uint();
>     writeln(t.has(123));
> }

Yes. The reason for this is that it avoids having to essentially 
do the same check twice. If `in` returned a bool instead of a 
pointer, after checking for whether the element exists (which 
requires searching for the element in the associative array), 
you'd then have to actually *get* it from the array, which would 
require searching again. Returning a pointer to the element if it 
exists (or `null` if it doesn't) cuts this down to 1 operation.


More information about the Digitalmars-d-learn mailing list