背景:
阅读文章

LPC基础数据类型:array和mapping

[日期:2008-12-25] 来源:  作者:泥巴创世纪 [字体: ]

array和mapping都是mud中用的最多的结构
与int,float等不同,两者都是传址类型
array是一个指向数组的指针,是有序的处理起来比较方便
mapping比较像字符数组,为一个无序的稀疏矩阵,用hash表储存
不过由于是传址的,array的复制好办,mapping就比较麻烦

mapping类型的赋值是传值的,array类型数组元素是传址的。

在Lpc中,使用*来申明array数组。可以申明为数组的数据类型有:int,float,string,mixed,object,mapping
array数组其特性有:1、可以静态的初始化,也可以不确定大小,使用allocate()这样的efun在运行中
定义大小。数组初始化的格式如 string *tex= ({"aa", "bb", "cc"}),也可以是空的如 string *tex=({}),2、不论数组是如何生成的,都支持+,-运算符操作。
 
mapping类型的"赋值"是传值的,是否可以这样理解
比如mapping a = ([]),b;
b = ([......]);
a["index"]=b;
这样来传值.
 
a["index"]=b是可以的

在LPC里面,除了将一个array赋值给另一个array(将一个mapping赋值给另一个mapping)其余的把一个array(mapping)赋值给别的地方的时候都会产生一个整个array(mapping)的复制过程

所以,完全可以不用copy来复制,只要用下面这个小技巧

mapping a, b;
a = ([...]);
b = ([]) + a;
b -= ([0]);
(这个技巧对array一样有效)


但是如果直接将一个array(mapping)赋值给另一个array(mapping)的话,就会只传递一个地址
比如
mapping a, b;
a = ([...]);
b = a;
那么对b的修改就会影响到a
(对array同样)

对array(mapping)使用 "==" 运算符的时候会只比较他们的地址,而不是内容
我写过两个函数来比较array和mapping的内容(我将它作为simul_efun使用)
很巧的是后来我在 RW 发现 sinji(RW的一位大神)也写了同样的东西 (当然两者
还是有些微差别,个人认为我写的那个效率会略高点点, 我写的那个版本在bbs.chinesemud.org
很早就发过,是实现仓库的里面中的一个文件, RW 的 sinji版,让msr来发吧)
收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论