"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