Thread overview
What is the preferred method for testing the existence of a key in an associative array?
Sep 13, 2013
Gary Willoughby
Sep 13, 2013
Adam D. Ruppe
Sep 13, 2013
Gary Willoughby
Sep 13, 2013
Orvid King
Sep 14, 2013
Jacob Carlborg
Sep 14, 2013
simendsjo
Sep 14, 2013
Namespace
September 13, 2013
What is the preferred method for testing the existence of a key in an associative array?
September 13, 2013
On Friday, 13 September 2013 at 14:03:48 UTC, Gary Willoughby wrote:
> What is the preferred method for testing the existence of a key in an associative array?

I use the in operator:

if(key in aa) {
  there
}

if(key !in aa) { not there}


You can also fetch the pointer right there too:

if(auto pvalue = key in aa) {
  auto value = *pvalue;
  // go ahead and use it
}
September 13, 2013
On Friday, 13 September 2013 at 14:03:48 UTC, Gary Willoughby wrote:
> What is the preferred method for testing the existence of a key in an associative array?

Well, I usually do it as:

int[string] someCache;

int getValue(string key)
{
    if (auto val = key in someCache)
        return *val;
    return someCache[key] = -3;
}
September 13, 2013
On Friday, 13 September 2013 at 14:06:50 UTC, Adam D. Ruppe wrote:
> I use the in operator:

Aha! ta.
September 14, 2013
On 2013-09-13 16:17, Orvid King wrote:

> Well, I usually do it as:
>
> int[string] someCache;
>
> int getValue(string key)
> {
>      if (auto val = key in someCache)
>          return *val;
>      return someCache[key] = -3;
> }

That doesn't work with generic code. I mean, -3 can be a legal value. There are many types that doesn't have an invalid value, like pointers do.

-- 
/Jacob Carlborg
September 14, 2013
On Saturday, 14 September 2013 at 10:50:17 UTC, Jacob Carlborg wrote:
> On 2013-09-13 16:17, Orvid King wrote:
>
>> Well, I usually do it as:
>>
>> int[string] someCache;
>>
>> int getValue(string key)
>> {
>>     if (auto val = key in someCache)
>>         return *val;
>>     return someCache[key] = -3;
>> }
>
> That doesn't work with generic code. I mean, -3 can be a legal value. There are many types that doesn't have an invalid value, like pointers do.

I don't understand. What doesn't work? If the key exists, val !is null, if it doesn't, val is null.
September 14, 2013
On Saturday, 14 September 2013 at 11:32:23 UTC, simendsjo wrote:
> On Saturday, 14 September 2013 at 10:50:17 UTC, Jacob Carlborg wrote:
>> On 2013-09-13 16:17, Orvid King wrote:
>>
>>> Well, I usually do it as:
>>>
>>> int[string] someCache;
>>>
>>> int getValue(string key)
>>> {
>>>    if (auto val = key in someCache)
>>>        return *val;
>>>    return someCache[key] = -3;
>>> }
>>
>> That doesn't work with generic code. I mean, -3 can be a legal value. There are many types that doesn't have an invalid value, like pointers do.
>
> I don't understand. What doesn't work? If the key exists, val !is null, if it doesn't, val is null.

I guess, he means your default value -3 isn't appropriate for all types.