Revamping associative arrays

Piotrek starpit at tlen.pl
Wed Oct 21 13:08:06 PDT 2009


Pelle Månsson pisze:
> Piotrek wrote:
>> Bill Baxter pisze:
>>> On Sun, Oct 18, 2009 at 1:12 PM, Piotrek <starpit at tlen.pl> wrote:
>>>> Bill Baxter pisze:
>>>>> I think the default should be to iterate over whatever 'in' looks at.
>>>>>
>>>> I was almost convinced, because that rule has a sense. But treating 
>>>> normal
>>>> arrays and associative array has more sense to me.
>>>>
>>>>
>>>> fun (SomeObject object) {
>>>> foreach (element;object.arr1){ //normal, but how do I know at first 
>>>> look
>>>> //just do something with element
>>>> }
>>>>
>>>> foreach (element;object.arr2){ // assoc, but how do I know at first 
>>>> look
>>>> //just do something with element hopefully not index
>>>> }
>>>
>>> That sounds like an argument that there should be no default, because
>>> either way it's not clear whether you're iterating over keys or
>>> values. 
>>
>>
>> Really?! That wasn't my intention :) In both cases I wish it were 
>> values ;)
>>
>>  > Just get rid of the the one-argument foreach over AAs altogether 
>> and force the user to be
>>  > explicit about it.
>>
>> I wouldn't do so. Would anybody do an error by thinking that foreach 
>> (elem,table) should iterate over keys?
>>
>> Maybe I'm not thinking correctly but for me an assoc array is just an 
>> array with additional key (index) features thanks to which I save 
>> space and/or have more indexing method than only integers.
>>
>>
>> e.g.
>>
>> Normal array
>>
>> No.       Item
>> 0    George
>> 1    Fred
>> 2    Dany
>> 3    Lil
>>
>> Index/key is infered from position (offset)
>>
>>
>> Now Assoc array:
>>
>> No.    Item
>> 10    Lindsey
>> 21    Romeo
>> 1001    C-Jay
>>
>> Or
>> No.    Item
>> first    Europe
>> second    South America
>> third    Australia
>>
>> Or
>> Names occurrence frequency:
>>
>> No. Item
>> Andy    21
>> John    23
>> Kate    12
>>
>> And the only difference is the need for using a hash function for 
>> value lookup (calculate position) which should not bother a user when 
>> he doesn't care.
>>
>> Then when you ask somebody to iterate over the tables, what he will do 
>> almost for certain? If it would be me, you know... values all the 
>> time. Even for last example most important values are those numbers 
>> (despite in this case they're meaningless without keys).
>>
>> Cheers
>> Piotrek
>>
> 
> 
> Put it this way:
>  Is there any time you are interested in the values without the keys?

Yes!

>  Is there any time you are interested in the keys without the values?
> 

Yes!

> If you're not interested in the keys, the real question would be why you 
> are using an associative array instead of just an array.
> 

The answer is simple. I can reuse AA in many different functions. 
Sometimes I need keys other time values and even... both :) That isn't 
the issue. The problem was about what should return short version of 
foreach over AA.

> I can think of at least one example of when you want key iteration, 
> which would be when using a bool[T] as a set.

See above.

Cheers
Piotrek



More information about the Digitalmars-d mailing list