字典
正式进入面向对象之前,我们先来学习一个新的数据类型:字典(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 支持的另一种字典语法,但是由于流行度不如本节重点介绍的那种,因此仅作为了解即可。