byKey and byValue: properties or methods?

Alvaro alvaroDotSegura at gmail.com
Tue Jan 17 14:47:55 PST 2012


El 17/01/2012 23:32, Timon Gehr escribió:
> On 01/17/2012 11:19 PM, Alvaro wrote:
>> El 17/01/2012 18:24, Andrei Alexandrescu escribió:
>>>> On 2012-01-17 06:48:26 +0000, Andrei Alexandrescu
>> ...
>>>
>>> aa.keys is taken btw.
>>>
>>
>>
>> OK, I see, .keys and .values currently return dynamic arrays.
>>
>> But the most appropriate property name for the above range should indeed
>> be .keys !
>>
>> Now, wouldn't it be be better to turn .keys into the proposed range?
>>
>> Let's see. What is the use of .keys?
>>
>> I searched phobos and found that .keys is mostly used to itarate over
>> the keys in a foreach loop. With the problem that is needs to allocate a
>> dynamic array. If silently changed to the proposed range, the foreach
>> loop would do the same and without an allocation.
>>
>> In a few unittests, .keys is followed by .sort, usually to print the
>> keys in order. That would not work... unless the produced range includes
>> a .sort method. Alternatively a .sortedKeys property can be added.
>>
>> The other use I see in phobos is just a typeof(a.keys[0]), which could
>> be replaced by typeof(a.keys.front)
>>
>>
>> What is the benefit of .keys as a range? it does not allocate an array,
>> just gives the keys.
>>
>> And if an array is needed, it is easy to turn a range into an array.
>> [Well, I'm missing a more direct way of doing that than using foreach
>> and appending]
>>
>
> See std.array.array.

Oops. Yes, thanks.

So, not bad. In those [infrequent, I'd say] cases needing an array one 
would do:

  auto keys = array(aa.keys);

even: (unsure if this would work, but somethig similar maybe)

  foreach(k; array(aa.keys).sort)
  {
     ... use the ordered keys
  }


More information about the Digitalmars-d mailing list