LPC 语言基础教程:2.2 LPC语言新增数据类型

本文节选自《LPC语言基础教程:从零学习游戏开发》,版权归@mudren,欢迎转载,但必须注明来源(mud.ren)。

第二节 LPC语言新增的数据类型

LPC语言还有以下新增数据类型:对象(object)、映射(mapping)、函数(function)、缓冲(buffer)和混合(mixed)。请注意,在有的驱动下还支持更多类型,但本教程以 fluffos 为标准,不支持其他类型。

1. 对象(object)

对象和类是分不开的,类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

LPMUD中所有.c源文件都是类,载入内存为具体对象,而且一个类文件可以没有任何代码(空类),比如在我们的测试 MUDLIB 中,连线对象所处的环境,其实是一个没有任何代码的空类(严格意义上是有代码的,至少有全局头文件)的具体实例。关于对象的使用,后期开发中会慢慢熟悉,这里只是简单的介绍一下对象类型的声明方式。

在LPMUD中所有 .c 文件载入内存后都是一个对象,包括蓝图对象和复制对象。在LPC语言中,对象类型变量使用 object 关键字定义。

object obj = clone_object("/std/weapon");

示例中clone_object()还有一个别名为new(),是驱动提供函数,用来实例化类/std/weapon.c

2. 映射(mapping)

映射可以理解为一种指定了键名的关联数组(变量类型是混合类型),在LPC语言中,映射类型变量使用 mapping 关键字定义。

mapping map = ([
    "name" : "ivy",
    "age" : 24,
]);

映射完全可以代替结构体来定义资料集合,如果要初始化一个空的映射可以使用以下方式:

mapping map = ([]);

映射必须先初始化才能指定其中的元素,因为游戏驱动默认会把所有没有给定初始值的变量初始化为 0 值,如果不初始化映射,再向映射加入元素时会报错。对新的键值可以使用以下方式加入映射:

map[key] = value;

使用这种方式,如果映射中有键名为 key 的元素,则对此元素赋值为 value,如果没有,则向映射中增加新的键和值。关于映射的用法会在后续章节中详细介绍。

3. 函数(function)

在LPC中函数指针(function)类型,可以用来指向各种匿名函数,因为关于函数的内容还未讲到,所以,这里先不做介绍,后续章节函数指针会专门详细介绍此类型的用法。

4. 缓冲(buffer)

缓冲类型是LPC语言中介于数组和字符串类型之间的一种数据类型,设计这个数据类型更多是为了方便对二进制数据操作。类似于C语言中的字符串,缓冲类型是一个字符数组,每个元素都是一个字符,长度是一个字节(byte),但和C语言的字符串不同,缓冲数据不是零值终止,需要指定长度。

// 示例:2.2.1
int main(object me, string arg)
{
    buffer bf = read_buffer("/include/globals.h", 0, 1000);
    buffer BF = read_buffer("/cmds/2.2.1.c", 0, 1000);

    bf +=BF;
    for (int i = 0; i < sizeof(bf); i++)
    {
        printf("%c", bf[i]);
    }

    return 1;
}

5. 混合(mixed)

如果数据类型为混合,代表可以赋值为任何类型,除非你的变量或反回值的数据类型可变,否则,不推荐使用 mixed 。对定义为混合类型的变量,在编译时不会检查数据类型,而是在运行时再检查数据类型。滥用混合类型容易出现编译正常运行才报错的BUG。

一个简单的混合类型示例:

 mixed value = random(2) ? "hello" : 1;

重要提示:混合类型是一种伪类型,变量的真实类型由值的类型决定。

需要注意的是,你可以把任何类型的值赋给mixed var变量,包括数组,但如果声明为mixed *var则只能赋值数组,如果对数组需要使用到混合类型,推荐使用mixed *var的方式定义。

京ICP备13031296号-4