Tak tohle nerozlišování mezi array a map nepatří IMHO do žádného jazyka. Přínos je prakticky nulový a zmatku kolem toho spoustu. Obzvlášť, když se má pak objekt exportovat (třeba do JSON). Je prázdná tabulka [] nebo {} ?
Tady palec nahoru pro perl a python, které mají dva různé typy a syntaxi.
Mimochodem, dá-li se použít jako klíč cokoliv, jak je to implementováno? Podobnou abstrakcí jako v Java, tedy hashCode() a equals() ?
Pravda je, že je dost zmatek především u operace #, tedy u operátoru, který vrací délku pole. No a jsme u toho - vrací délku té části tabulky, která je indexovaná.
Jako já s tím v praxi bojoval zatím na dvou místech, především kvůli rozdílům mezi pairs() a ipairs(). Tady kdyby došlo k rozdělení na dva datové typy, pak by vlastně pairs() a ipairs() mohlo zmizet, protože v 99% případů se používá ve for smyčce.
Ja to chapu tak, ze v jazyce Lua neni rozdil zadny (tabulkami se zde resi vse). Ale v jinych jazycich - treba v C++ muze byt ten rozdil propastny. Uz jen proto, ze mapa indexuje prvky podle hashe a vector podle pozice. Znamena to, ze implementace kazde z variant a efektivita operaci u kazde z nich je ponekud jina, a je tedy na zvazeni kdy je vyhodnejsi pouzit tu ci onu variantu - coz treba v Lua normalne neumoznuje.
No ona to Lua praveze umoznuje, protoze v zavislosti na tom, jestli jsou pouzity celociselne indexy nebo klice (specialne stringy) se pouzije jiny algoritmus a interne i jina datova struktura - bud pole nebo hashtable.
Viz napriklad http://www.lua.org/source/5.2/ltable.c.html
popr.
typedef struct Table { CommonHeader; lu_byte flags; /* 1<<p means tagmethod(p) is not present */ lu_byte lsizenode; /* log2 of size of `node' array */ struct Table *metatable; TValue *array; /* array part */ Node *node; Node *lastfree; /* any free position is before this position */ GCObject *gclist; int sizearray; /* size of `array' array */ } Table;
<i>Mimochodem, dá-li se použít jako klíč cokoliv, jak je to implementováno? Podobnou abstrakcí jako v Java, tedy hashCode() a equals() ?</i>
V podstatě ano, implementaci lze vidět tady:
http://www.lua.org/source/5.2/lvm.c.html#luaV_equalobj_
a