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.
"Mimochodem, dá-li se použít jako klíč cokoliv, jak je to implementováno? Podobnou abstrakcí jako v Java, tedy hashCode() a equals() ?"
AFAIK lze použít cokoli kromě nil.
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;
Aha, ona to rozlisuje automaticky podle typu indexu, to me mohlo taky trknout :-( To ted vysvetluje nektera "podivna" chovani tabulek, na ktera jsem zezacatku narazel. Diky
No ona je ta vlastnost trošku schovaná a asi každý programátor se ze začátku napálil s rozdílem pairs(), ipairs() či indexováním od jedné :-)
Nojo i Lua má, jako každý programovací jazyk, svá temná zákoutí. Ale kupodivu jich je jen několik. Kromě tabulek (indexy vs. klíče) někomu vadí indexování od jedničky, neexistence continue (to má svůj význam); to je asi tak vše :-)
<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