字典是将名称或 键 与值关联的表,而不是索引。
示例:
local pet = {
Name = "Bobbie",
Type = "Dog",
}当你需要标记值,而不仅仅是像数组那样按顺序列出它们时,请使用字典。在本教程中,通过操作与玩家相关联的值来练习使用字典。
字典语法
与数组一样,字典使用大括号 {} 赋值给变量。键值对 在单独的行上存储,并以逗号结尾。键和值可以是任何数据类型,包括字符串、数字和变量名。
local playerNames = {
player1 = "Zap",
player2 = "Kel",
}
print(playerNames["player1"])要将部分或其他实例化对象作为键进行引用,请使用方括号。
local greenPart = workspace.GreenPart
local redPart = workspace.RedPart
local partList = {
[greenPart] = true,
[redPart] = false,
}
print(partList[redPart])创建字典
字典的一个日常用途是组织玩家或角色信息。这些步骤探讨如何存储和访问一个理论上的敌方角色的信息。
在一个新脚本中,创建一个名为 enemy 的字典。
local enemy = {}字典中的第一个键将使用一个名为 Name 的变量来跟踪敌人的名字。
local enemy = {Name}将敌人的名字分配给该键,后面跟一个逗号。
local enemy = {Name = "Spike",}添加第二个键值对,表示敌人应该有多少生命值。请记住,键应该始终使用相同的数据类型,但值不必。
local enemy = {Name = "Spike",Health = 1000,}
使用字典值
访问字典值有两种方法:
- tableName["keyName"](重要的是,注意引号)
- tableName.keyName
local enemy = {
Name = "Spike",
Health = 1000,
}
print("反派 " .. enemy["Name"] .. " 逼近!")
print("反派 " .. enemy.Name .. " 逼近!")使用哪种风格通常取决于表的目的。对于像服务器中玩家列表这样的值集合,程序员通常会使用 tableName["keyName"]。对于用于描述对象的字典,程序员更可能使用 tableName.keyName。
更改字典值
更改键的值与任何其他变量相同;使用等号 = 操作符。
在 enemy 表下,将敌人的名字设置为其他名称。
local enemy = {Name = "Spike",Health = 1000,}enemy.Name = "Rana"print("敌人的名字是 " .. enemy.Name)进行游戏测试并检查输出窗口。
预先存在的变量作为键
字典可以与在脚本其他部分声明的预先存在的变量进行交互。以下代码示例使用一个变量在玩家加入游戏时将其名字作为键添加,然后将他们的积分值设置为 0。
在 ServerScriptService 中,创建一个名为 PlayerPoints 的新脚本。在脚本中,获取 Players 服务并创建一个空字典,名为 playerPoints。
local Players = game:GetService("Players")local playerPoints = {}编写一个本地函数,用于设置玩家积分,参数为新玩家变量。将该函数连接到 Players.PlayerAdded 事件。
local playerPoints = {}local function setPoints(newPlayer)endPlayers.PlayerAdded:Connect(setPoints)在函数中,添加一个变量以获取玩家的 Name,这是每个 Player 对象中的一个属性,并添加一个打印语句进行测试。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("你好 " .. name)end将 name 插入 playerPoints 字典作为键,并将值(玩家的积分)设置为 0。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("你好 " .. name)playerPoints[name] = 0end使用 name 打印玩家的名字,并使用 playerPoints[name] 打印与变量匹配的键的值。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("你好 " .. name)playerPoints[name] = 0print(name .. " 有 " .. playerPoints[name] .. " 积分。")end运行项目并观察输出。
local Players = game:GetService("Players")
local playerPoints = {
}
local function setPoints(newPlayer)
local name = newPlayer.Name
print("你好 " .. name)
playerPoints[name] = 0
print(name .. " 有 " .. playerPoints[name] .. " 积分。")
end
Players.PlayerAdded:Connect(setPoints)可选挑战
以下是一些适用于以不同方式使用字典的挑战。看看你能否为这些构建代码。
- 创建一个陷阱部件,对玩家造成持续伤害。一旦玩家触碰到陷阱,就对他们造成伤害,等待,然后允许他们再次受到伤害。
- 创建一个函数,通过访问字典检查两个玩家中谁的积分更多。
- 创建一个密码系统,将一个字符串替换为另一个字符串以创建“秘密”代码。例如,字母“A”可以替换为“G”,或者单词“apple”可以替换为“orange”。
字典和 pairs()
pairs() 是一个常用于遍历 字典 的函数。下面是一个示例。
local myDictionary = {
["蓝色玩家"] = "Ana",
["金色玩家"] = "Binh",
["红色玩家"] = "Cate",
}
for key, value in pairs(myDictionary) do
print(key .. " 是 " .. value)
endpairs() 可以用于处理字典元素的键、值或两者。在下面的 for 循环中,第一个变量是键。第二个变量是值。要处理的字典传递给 pairs()。
local inventory = {
["金砖"] = 43,
胡萝卜 = 3,
火把 = 2,
}
print("你拥有:")
for itemName, itemValue in pairs(inventory) do
print(itemValue, itemName)
end执行时,代码将打印以下内容:
你拥有:
43 金砖
3 胡萝卜
2 火把总结
字典是使用键值对而不是索引值的表。字典和数组的开始方式相似,都是将大括号赋值给变量。保持条目用逗号分隔。
字典中的所有键应使用相同的数据类型,但值可以混合数据类型而没有问题。
访问字典的方式可以传达其目的。敌人属性的字典可能会使用点操作符访问,而名字列表可能会使用 tableName[keyName]。
使用方括号时要小心;在表中创建的键名必须作为字符串处理:tableName["keyName"]。然而,当引用像部件这样的对象时,不需要引号:tableName[keyName]。
许多脚本需要遍历字典或数组,但你可能并不总是知道这些数据结构的开始和结束。例如,玩家的字典可能在变化,或者玩家可能有一个大小不一的数组库存。
在这些情况下,你可以在 for 循环中使用 pairs() 和 ipairs() 来遍历每个元素,而无需知道开始和结束点。你也可以使用 in 关键字进行一般迭代,以循环遍历元素,而无需使用 pairs() 或 ipairs()。