พจนานุกรมเป็นตารางที่เชื่อมโยงชื่อหรือ คีย์ กับค่าที่ไม่ใช่ดัชนี
ตัวอย่าง:
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 object และคำสั่งพิมพ์สำหรับการทดสอบ
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 = {
["Blue Player"] = "Ana",
["Gold Player"] = "Binh",
["Red Player"] = "Cate",
}
for key, value in pairs(myDictionary) do
print(key .. " คือ " .. value)
endpairs() สามารถใช้ทำงานกับคีย์ ค่าหรือทั้งสองอย่างขององค์ประกอบพจนานุกรม ในลูป for ด้านล่าง ตัวแปรแรกคือคีย์ ตัวแปรที่สองคือค่า พจนานุกรมที่คุณต้องการทำงานด้วยจะถูกส่งไปยัง pairs().
local inventory = {
["Gold Bricks"] = 43,
Carrots = 3,
Torches = 2,
}
print("คุณมี:")
for itemName, itemValue in pairs(inventory) do
print(itemValue, itemName)
endเมื่อรันโค้ด จะพิมพ์ดังนี้:
คุณมี:
43 Gold Bricks
3 Carrots
2 Torchesสรุป
พจนานุกรมเป็นตารางที่ใช้คู่คีย์-ค่าแทนค่าที่มีดัชนี พจนานุกรมและอาร์เรย์เริ่มต้นคล้ายกันโดยการกำหนดวงเล็บปีกกาให้กับตัวแปร แยกเอนทรีด้วยเครื่องหมายจุลภาค
คีย์ทั้งหมดภายในพจนานุกรมควรใช้ประเภทข้อมูลเดียวกัน แต่ค่าสามารถผสมประเภทข้อมูลได้โดยไม่มีปัญหา
วิธีการเข้าถึงพจนานุกรมสามารถบ่งบอกถึงวัตถุประสงค์ของมัน พจนานุกรมของคุณสมบัติของศัตรูจะถูกเข้าถึงด้วยตัวดำเนินการจุด ในขณะที่รายชื่อชื่อจะใช้ tableName[keyName].
เมื่อใช้วงเล็บ ให้ระมัดระวัง; ชื่อคีย์ที่สร้างขึ้นภายในตารางจะต้องถูกปฏิบัติเสมือนสตริง: tableName["keyName"]. อย่างไรก็ตาม เมื่ออ้างอิงถึงวัตถุเช่นชิ้นส่วน เครื่องหมายคำพูดจะไม่จำเป็น: tableName[keyName].
สคริปต์หลายตัวต้องวนซ้ำผ่านพจนานุกรมหรืออาร์เรย์ แต่คุณอาจไม่รู้จุดเริ่มต้นและจุดสิ้นสุดของโครงสร้างข้อมูลเหล่านี้เสมอไป ตัวอย่างเช่น พจนานุกรมของผู้เล่นอาจมีการเปลี่ยนแปลง หรือผู้เล่นอาจมีอาร์เรย์สินค้าที่มีขนาดแตกต่างกัน
ในสถานการณ์เหล่านี้ คุณสามารถใช้ pairs() และ ipairs() ในลูป for เพื่อวนซ้ำผ่านแต่ละองค์ประกอบโดยไม่ต้องรู้จุดเริ่มต้นและจุดสิ้นสุด คุณยังสามารถใช้การวนซ้ำทั่วไปผ่านคำว่า in เพื่อวนซ้ำผ่านองค์ประกอบโดยไม่ต้องใช้ pairs() หรือ ipairs().