mappings


使用映射 (mapping)     1992 September 28
MudOS 映射数据类型文件 -  撰稿: Truilkan@TMI

MudOS 0.9 提供了名为「映射」的数据类型. 映射与其他语言中的联结数组 (associative arrays)  一样 (例如 Perl). 一个联结数组与普通的数组类似, 但是联结数组可以使用任何数据类型 (字符串、物件、整数、数组等等) 作为索引(index) , 而数组只能使用整数. 另外, 联结数组是疏松的数组 (sparse arrays), 也就是说, 您可以只指定第 1,000,000  项元素的内容, 而不必指定其他元素.
映射有两个实际的用途:

这样声明一个映射: 一个映射可以用两种方法初始化 (initialize):    (注意: x = ([]); 可以造出一个空的映射)

请注意一个映射必须先初始化, 才能指定其中的任何元素. 有此限制是因为游戏驱动程序将所有的变量初始化为 0 (不管变量是什么类型).  如果您没有初始化一个映射, 您为此数组指定元素时, 就会看到 Indexing on illegal type  (索引指向的数据类型违法) 的错误.

新的 (关键字, 内容值) 可以用以下的方法加进一个映射:

上面的语句使驱动程序寻找在映射 x  中的特定关键字 (key). 如果映射 x  有此关键字, 则映射中联结的内容值 (value)  就换成等号右边指定的值. 如果映射并没有包括这个关键字, 则会自动动态 (dynamically) 配置 (allocate)  另外的空间, 并将新的 (关键字, 内容值) 插入映射中.

映射中的一个元素可以下行的方式读取:

一个数组的元素可以下行的方式删除: 删除之后, 会让下面的运算式为真 (1): 所以您可以撰写像以下的源代码: 关键字 (索引) 的列表可以用 keys() 外部函数列出, 举例如下:

   mixed *idx;
   map x;

   x = ([ "x" : 3, "y" : 4]);
   idx = keys(x);        /* idx == ({"x", "y"}) 或 ({"y", "x"}) */

请注意, 看来很明显的, keys()  会以一个随机的顺序 (random) 返回索引的列表 (这种随机的顺序, 是映射储存数据的方式的副作用 ---- 在此, 是因为可扩充式数据搜寻表 (extensible hash table)  顺序的关系)

一个映射的内容值 (values) 列表, 可以 values() 外部函数列出:

使 idx 等于 ({3, 4}) 或 ({4, 3}). 注意, values() 返回的内容值顺序则跟 keys() 返回的顺序相同.

 (关键字, 内容值) 在一个映射中, 可以利用 each()  外部函数反覆搜寻. each()  在找到映射的尾端时, 就返回一个空向量 (null vector).  each() 返回 (关键字, 内容值) 的顺序, 与 keys() 和 values()  返回的顺序相同. 举例:

映射可以为二元 (two-dimensional) (或是更高次元的映射),  道理与 LPC  数组相同:
  所以: 定义出 a["driver"] == "castle";

您也可以将两个映射相加. 两个映射的总和定义为两个映射的联集 (union).

定义出 a["driver"] == "mudlib"a["mudlib"] == "castle"

+=」也可使用. 所以您可以用:

可以代替: 不过, 后面这种 a[key] = value 的形式要比前面的 a += ([key : value]) 的方法要来得有效率. 因为前面的方法还要创造一个新的映射[译按: 指 ([key : value]) 这个映射], 而后者不用.

映射不能使用 - (减号) 运算符[要使用 map_delete() ].

sizeof() 外部函数可以判断一个映射中有多少对 (关键字, 内容值)  的数据.

内部的做法 (implementation):

MudOS 的映射使用可扩充式的数据搜寻表 (extensible hash table). 数据搜寻表的大小一定是 2  的乘幂 (power of 2).  当数据搜寻表的内容装满一定的程度时, 数据搜寻表的就增为两倍以维持数据搜寻的效率.


作者:


MudOS 的映射原本由 Whiplash@TMI 所写. 其中的一部份后来由 Truilkan@TMI 重写[使用可扩充式的数据搜寻表以替换原来的二元树 (binary tree)].

映射数据结构的一部份是基于 Larry Wall 写的 Perl 程序语言的 hash.c 模组. Perl  的整套程序适用于 GNU Copyleft general public license.


翻译: Spock @ FF 97.Aug.11.

回到上一页