"in" operator gives a pointer result from a test against an Associative Array?
Steven Schveighoffer
schveiguy at gmail.com
Fri May 10 03:07:43 UTC 2024
On Friday, 10 May 2024 at 01:00:09 UTC, Andy Valencia wrote:
> On Friday, 10 May 2024 at 00:40:01 UTC, Meta wrote:
>> 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.
>
> Looking at Programming in D section 28.5, I'm guessing that
> pointer versus null is treated as the appropriate boolean value
> when consumed by an "if" test. So that example is getting a
> pointer to a string, or null, but the example looks exactly as
> the same as if it had directly gotten a bool.
Yes, we say that a type has "truthiness" if it can be used in a
condition (`while`, `if`, `assert`, etc).
For a pointer, `null` is considered "false", whereas any other
value is considered "true". So you can use statements like
`if(key in aa)` to test for membership. A very nice idiom is to
check if a key is in an associative array, and if so, use the
value that it maps to:
```d
if(auto v = key in aa) {
// use *v as the value here
}
```
You can change your code to `return (e in this.members) !is null;`
-Steve
More information about the Digitalmars-d-learn
mailing list