"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