背景:
阅读文章

mud常量和变量类型

[日期:2007-05-10] 来源:  作者: [字体: ]

常量和变量类型
--------------------------------------------------------------------------------

LPC的全局常量,一般都是通过 globals.h 这个文件来完成。这个全局定义文件,将会是所定义的内容在整个Mudlib有效。通过定义 runtime_config.h,可以通过 get_config() 来获得系统的一些基本属性,这些属性都是在config文档中所预先定义的。

Lpc的变量类型不是很多,但是感觉足够用。我们不讨论一些比较偏门的声明,比如status,char这种,大多数的MudOS编译结果,都会淘汰这些。

int,string,array,object,mapping,function,float,buffer,class,void,mixed

int 是最实用的类型之一,在LPmud中,int足可以表示很多数学问题。32位系统中,int的范围是 -2147483648 ~ +2147483648,所以一般房间继承中的 int query_max_encumbrance() { return 100000000000; }
就是 int query_max_encumbrance() { return 2147483648; } 设计Lib的时候,要注意运算不要超过这个范围,否则就是常说的溢出现象了,如果运算结果超过最大值,就会转向相反的方向,负值为正,正值为负。赋值如果超过范围,那么系统自动会取的最大限。一个只有声明没有赋值的整数变量,可以被系统认为是0。因为整数的NULL和0接近。所以,你可以这样做: int i; i++;

string 是Lpmud的主体定义之一,几乎很多形态都是字符串,尤其是整个世界!头尾加上一个引号,就变成了字符串。比如:string line = "this line"; 如果数值加上引号,也是字符串:"392032"。在字符串中,有一些常用的符号,比如 "\n" 表示一个换行,"\b" 表示一个tab符,这些和标准C没有太大的区别。一个只有声明没有赋值的字符串变量,被系统认为是NULL。字符串变量不会和 0 有关。所以你一旦这样做,就会出错: string i; i += ""; 换个方式,这样做,就可以避免这个错误:string i=""; i += ""; 虽然这段代码毫无意义,但是空的字符串必须通过""来赋值,而不是简单的通过声明。

array 这个关键字的出现,其实我个人认为和MudOS编译有关,最简单的方式就是在变量声明前加上 * ,这是一个方便的方式,当然,如果你觉得会和你的C习惯相冲突的话,那么,使用 array 可以避免困惑。一个数组的定义必须附加上数组成员类型的说明,一般如下: int array x = ({}); 或者 int *x = ({}); 相信,国内大多数设计者更习惯看到后一种定义方式。数组是有排序的,如果数组没有进行过运算,那么它的序列总是不变的,这和你书写的时候有关,比如: int array x= ({1,2}); x[0] 就是 1,x[1]就是2。

mapping 映射,这是别人的翻译,我习惯直接说 mapping,呵呵。这个类型比较奇特,它有数组的一些特性,比如其他语言的关联数组,但是又有一些类的特性。由于ES2使用mapping来作为大量数据的定义,所以这个类型可以说是很多人常见到的。一般的定义可以是这样子的: mapping x = (["a":1,"b":2]); 于是,x["a"]就是1,x["b"]就是2,这很象是关联数组。需要注意的是,映射是没有序列的,虽然你总是可以通过keys() 或者 values()获得一个紧过排序的数组,但是,这个序列和你的书写毫无关系。简单的说来, mapping x=(["a":1,"b",2]); 和 mapping x = (["b":2,"a":1]); 结果是一样的。所以不要试图实用 mapping 序列来访问成员,你必须通过关键字来访问。mapping 成员不需要声明类型,完全根据赋值情况而定。比如上面的例子里,成员都是整型的。

object 物件,毫无疑问,LPC的创造者不断的吸收新的元素来进化LPC,而LPC的物件几乎完美的。你可以在其他语言看到object或者class类的定义,这些和LPC的object非常相似。但是这里,object更为强大。一般的定义是:object ob; 物件的一个特性,就是允许外界通过 call_other 来访问物件内的函数,或者是 ob->foo()。物件中,定义的物件变量,如果想被外部所引用,就必须设定一个函数来指出。这就是国内LPmud大量存在的 query() 类型函数的作用。MUD中的很多东西都是物件,有些物件是显而易见的,比如room,npc,item,但是skill也是物件,只不过有些物件没有形状,没有重量,也没其它感性表现,常常给人忽略。对于object处理,大大不同于其它类型。因为它更象是一个实体,一个有着感性的东西。所以object不能运算,当然也不能用来赋值变化。

function 函数定义。这是很重要的一个东西,因为Mud需要物件,物件需要函数和变量。没有函数,就不能构架Mud世界。函数的定义,一般和数组一样,需要定义函数的类型。比如:int query_int() {} 。注意的是,函数的结尾是不需要分号的。但是函数内的语句还是和一般的语句一样,需要分号。函数的呼叫,可以在物件内部执行,也可以由外部呼叫,可以使用call_other也可以使用 "->" 运算符。比如 ob->query_int();

void 无定义。这个主要用于函数的定义上,如果函数没有返回值或则不需要返回值,那么void fun(){}是比较好的方式。

mixed 这个定义可以用于任何变量或者函数。这个混合含义意味着声明的变量或者函数是需要变化的。比如我们定义一个变量 mixed ob; 开始的时候,我们需要让 ob = "aa"; 然后,我们又需要让它成为一个物件,那么, ob = this_object();用的最多的地方,是在一个传递过来的变量类型是未知的情况,定义函数局部变量。如果你不能确定变量的类型的话,不妨使用 mixed 来定义变量。

buffer 这个声明主要用来处理一些efuns返回的数值。很多情况下,Mud世界需要得并不多。

class 是比较新的一种特性,这和常规的类很相似,是符合人们习惯的一种设定。不过 object 用得更多。与object不同的是,类可以直接引用成员的特性。

比如:

Months[i] = new(class month);
sscanf(lines[i], "%s:%s:%d:%d",((class month)Months[i])->Name,((class month)Months[i])->Season,((class month)Months[i])->Days,((class month)Months[i])->DaylightHours);


尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论