LPC和C对比
目录
数据类型
string类型
直接当成cpp的string类
但是取子串有所不同
str[n1..n2]
取子串
// 示例:2.1.6
int main(object me, string arg)
{
string s = "www.mud.ren";
printf("s = %s\n", s);
printf("s[4..4] = %s\n", s[4..4]);
printf("s[4] = %c\n",s[4]);
printf("s[4] = %d\n",s[4]);
printf("s[4..6] = %s\n", s[4..6]);
printf("s[0..20] = %s\n", s[0..20]);
printf("s[7..] = %s\n", s[7..]);
printf("s[4..<1] = %s\n", s[4..<1]);//<n可以理解为strlen(s)-n
printf("s[<7..<5] = %s\n", s[<7..<5]);//可以理解为从右数第7个取到从右侧数第5个
printf("s[1..0] = %s\n", s[1..0]);
printf("s[20..30] = %s\n", s[20..30]);
printf("s[<5..<7] = %s\n", s[<5..<7]);
return 1;
}
输出结果:
s = www.mud.ren
s[4..4] = m
s[4] = m
s[4] = 109
s[4..6] = mud
s[0..20] = www.mud.ren
s[7..] = .ren
s[4..<1] = mud.ren
s[<7..<5] = mud
s[1..0] =
s[20..30] =
s[<5..<7] =
object
object 是代表游戏中的一个对象的基本类型。每个 object 都是一个独立的实体,可以具有属性、方法和状态。
LPC中所有的.c文件都是能视为对象
创建
object ob = clone_object("/path/to/my_object.c");
对象的属性和方法
// my_object.c
int my_property;
void set_property(int value) {
my_property = value;
}
int query_property() {
return my_property;
}
销毁
destruct(ob)
mapping
类似python中的dict,cpp中的map/unordered_map,是键值对的形式
但是不同的是,键可以是不同的类型比如:mapping mixed_mapping = ([1: "one", "two": 2, "three": 3.14]);
- 使用需要初始化
// 错误示例:未初始化的映射
mapping data;
// 尝试给未初始化的映射添加元素,会导致运行时错误
data["key"] = "value";
// 正确示例:映射初始化
mapping data;
// 初始化映射
data = ([ ]);
// 可以安全地给映射添加元素
data["key"] = "value";
- mapping默认的赋值操作是引用赋值
mapping data1, data2;
data1 = (["key1": "value1", "key2": "value2"]);
data2 = data1; // 引用赋值
// 修改其中一个映射
data1["key1"] = "new_value";
// 打印另一个映射的值,也会受到影响
write(data2["key1"]); // 输出:new_value
如果需要取得一个副本,需要使用copy函数
mapping data1, data2;
data1 = (["key1": "value1", "key2": "value2"]);
data2 = copy(data1); // 创建独立副本
// 修改其中一个映射
data1["key1"] = "new_value";
// 打印另一个映射的值,不受影响
write(data2["key1"]); // 输出:value1
创建
mapping my_mapping = allocate_mapping(0);
添加键值对
my_mapping = m_add(my_mapping, "key1", "value1");
my_mapping = m_add(my_mapping, "key2", "value2");
获取
string value = m_value(my_mapping, "key1");
当然也可以使用mapping["key1"]
检查键是否存在
if (m_contains(my_mapping, "key1")) {
// 键存在
} else {
// 键不存在
}
删除元素
my_mapping = m_delete(my_mapping, "key1");
遍历
使用foreach
m_indices可以获得mapping中所有键的列表
string *keys = m_indices(my_mapping);
foreach (string key in keys) {
string value = m_value(my_mapping, key);
// 处理键值对
}
buffer
类似字符串,不过通常用于处理二进制数据
运算符
没有的运算符
-
.
运算符
若要使用对象的函数或者属性可以使用->
-
&
取地址
lpc不涉及对内存底层的操作,所有不需要取值
如果需要传引用,请使用ref
int plusone(int ref x)
-
sizeof
作用是获取数组(array)、映射(mapping)的元素个数或字符串(string)和缓冲(buffer)的长度
分支语句
switch
特殊用法:从..延伸出的用法
// 示例:4.1.2
int main(object me, string arg)
{
int x = atoi(arg);
switch (x)
{
case 0..0:
write(0);
break;
case 11..20:
write(2);
break;
default:
write(520);
break;
case 1..10:
write(1);
break;
case 21..:
write(999);
break;
case ..-10:
write(-99);
};
return 1;
}
循环语句
foreach
// 示例:4.2.1
int main(object me, string arg)
{
int *array = ({1, 2, 3, 4, 5, 6, 7});
foreach(int i in array)
{
printf("%d\n", i);
}
return 1;
}
foreach中支持ref关键字?这里不是很清楚
int main(object me, string arg)
{
mixed *arr = ({1,2,3,4,5});
foreach(int ref x in arr)
x *= 3;
// print_r为自己写的sefun,格式化打印数组的值方式调试用
print_r(arr);
return 1;
}