Skip to content

特殊类型

在数据模板中,为了贴合Minecraft中一种NBT值可空和可能为多种类型的情况,数据模板中提供了两种特殊的类型——可空类型和联合类型。

可空类型

可空类型表示,在数据模板中,这个值是可选的。在给数据模板赋初值的时候,或者数据模板生成默认数据的时候,可以不用包含这个键对应的值。

但是,编译器只会在赋值的时候检查可空类型,而不会在访问的时候检查非空类型。换句话说,在访问成员的时候,编译器不会管这个成员的类型是不是可空类型,也不会判断这个成员是否是空值。在生成命令的时候,可空类型的使用和其他普通的类型完全一样,即使在游戏中可能会因为不存在而报错。

mcfpp

data Test{
    int a;  
    int? b; # b是可空的
}

func main(){
    Test test = {
        "a": 1
    };
    print(test.b); # 编译不报错,但是在游戏中执行命令会出问题
}

联合类型

联合类型表示,在数据模板中,这个值可以是多种类型之一。

mcfpp

data Test{
    (int|String) a; # a可以是int或者String
    (int|String)? b; # b可以是int或者String,也可以是空值
}

func main(){
    Test test1 = {
        "a": 1
    };
    Test test2 = {
        "a": "qwq"
    };
}

访问联合类型的时候,需要强制转换类型,否则会退化为两种类型的最小公共类型。

mcfpp
# ...接上文
print(test1.a); # 退化为any类型
print((int)test2.a); # 作为int类型
print((string)test2.a); # 作为string类型