字典

正式进入面向对象之前,我们先来学习一个新的数据类型:字典Dictionary)。

字典使用键值对存储数据,键值对是指一个键和一个值组成的一对数据,例如 我的名字是 Rika 这句话中,我的名字 就是键,Rika 是值。

让我们回顾一下数组,GDScript 的数组由方括号 [] 包裹,其中填入很多元素并用逗号 , 分隔。

字典的语法也类似,不过是使用花括号 {} 包裹起来,其中填入很多键值对,键值对之间也用逗号 , 分隔。至于键值对,则是两个数据之间用冒号 : 分隔。

例如存一个玩家信息:

var 玩家信息: Dictionary = {
    "名字": "Rika",
    "年龄": 22,
    "职业": "赤魔法师",
}

其中的 名字、年龄、职业 就是键,每个冒号后面的就是值。

注意一点,键值对的键和值都是数据,所以 名字、年龄、职业 这些键都是一个字符串,不能是变量那种直接写的名字。

获取元素值的方式也很类似数组,方括号里直接填写键即可,例如显示玩家名字:

print(玩家信息["名字"])

动态键

字典有什么有点呢,我们也可以直接写三个变量分别存储 名字、年龄、职业 对吧?

动态的元素是字典的一大特点,就类似数组,我们可以随时向里面添加或删除数据,而变量则需要提前声明好。

由于字典元素不确定,所以不能随意从中取值,例如在上面的代码中运行 print(玩家信息["啥"]) 就会得到一个错误。

如果不能保证某个键是否存在,可以使用 in 关键字(或者叫运算符)进行判断,in 的左边是键,右边是字典,结合 if 关键字:

if "武器" in 玩家信息:
    print("玩家手持 " + 玩家信息["武器"])
else:
    print("玩家没有武器")

这样的 if xxx in xxx 即可判断字典是否包含某个键。

如果只是简单的获取值,每次都加这个 if xxx in 也太麻烦了,所以 GDScript 为字典对象提供了一个方法,叫做 get

print(玩家信息.get("名字"))
# 等同于
print(玩家信息["名字"])

如果玩家信息中不包含名字键,则 get 方法会返回一个 null,而 ["名字"] 索引则会报错并停止游戏。

同时,get 方法的第二个参数可以指定一个默认值,若键不存在,则返回这个默认值:

print(玩家信息.get("名字", "无名"))

上例代码中,若 玩家信息 中不包含 名字 键,则输出 无名 二字。

增加、删除

若要向字典中添加数据,直接使用元素赋值语句即可:玩家信息["武器"] = "小棍子"。如果字典中存在武器键,则会修改对应的值,若没有武器键则会创建这个键并赋值。

若要删除,则调用 erase 方法并传入一个键,例如 玩家信息.erase("武器") 就会删除武器键值对。

[!note]

字典和数组一样,是引用类型数据!

[!tip]

或许你有概率在其他的资料中看到这样的字典写法:

var 玩家信息 = {
    名字 = "Rika",
    年龄 = 22,
    职业 = "赤魔法师"
}
print(玩家信息.名字)

看起来和咱们学的不太一样,不过本质逻辑还是一样的,这是 GDScript 支持的另一种字典语法,但是由于流行度不如本节重点介绍的那种,因此仅作为了解即可。