MudOS 0.9 提供了名为「映射」的数据类型. 映射与其他语言中的联结数组 (associative
arrays) 一样 (例如 Perl). 一个联结数组与普通的数组类似, 但是联结数组可以使用任何数据类型
(字符串、物件、整数、数组等等) 作为索引(index) , 而数组只能使用整数. 另外,
联结数组是疏松的数组 (sparse arrays), 也就是说, 您可以只指定第 1,000,000
项元素的内容, 而不必指定其他元素.
映射有两个实际的用途:
请注意一个映射必须先初始化, 才能指定其中的任何元素. 有此限制是因为游戏驱动程序将所有的变量初始化为 0 (不管变量是什么类型). 如果您没有初始化一个映射, 您为此数组指定元素时, 就会看到 Indexing on illegal type (索引指向的数据类型违法) 的错误.
新的 (关键字, 内容值) 可以用以下的方法加进一个映射:
映射中的一个元素可以下行的方式读取:
mixed *idx;
map x;
x = ([ "x" : 3, "y" : 4]);
idx = keys(x); /* idx
== ({"x", "y"}) 或 ({"y", "x"}) */
请注意, 看来很明显的, keys() 会以一个随机的顺序 (random) 返回索引的列表 (这种随机的顺序, 是映射储存数据的方式的副作用 ---- 在此, 是因为可扩充式数据搜寻表 (extensible hash table) 顺序的关系)
一个映射的内容值 (values) 列表, 可以 values() 外部函数列出:
(关键字, 内容值) 在一个映射中, 可以利用 each() 外部函数反覆搜寻. each() 在找到映射的尾端时, 就返回一个空向量 (null vector). each() 返回 (关键字, 内容值) 的顺序, 与 keys() 和 values() 返回的顺序相同. 举例:
while ((pair = each(x)) != ({})) {
x = ([]);
y = ([]);
y["a"] = "c";
x["b"] = y;
r1 = ([]);
r2 = ([]);
r1["driver"] = "mudlib";
r2["mudlib"] = "castle";
您也可以将两个映射相加. 两个映射的总和定义为两个映射的联集 (union).
「+=」也可使用. 所以您可以用:
映射不能使用 - (减号) 运算符[要使用 map_delete() ].
sizeof() 外部函数可以判断一个映射中有多少对 (关键字, 内容值) 的数据.
MudOS 的映射使用可扩充式的数据搜寻表 (extensible hash table). 数据搜寻表的大小一定是 2 的乘幂 (power of 2). 当数据搜寻表的内容装满一定的程度时, 数据搜寻表的就增为两倍以维持数据搜寻的效率.
映射数据结构的一部份是基于 Larry Wall 写的 Perl 程序语言的 hash.c 模组.
Perl 的整套程序适用于 GNU Copyleft general public license.