23. Tabel sebagai Kamus
Tipe tabel yang dipakai untuk list juga mendukung kunci bernama. Dengan nama (string) sebagai pengganti posisi (angka), tabel bekerja seperti kamus — kumpulan fakta tentang satu hal.
Membuat kamus
Sintaks literalnya menggunakan key = value di dalam
kurung kurawal:
local player = {
name = "Keiko",
level = 7,
hp = 95,
alive = true,
}Koma di akhir itu opsional, tapi merupakan gaya yang baik: membuat penambahan field jadi satu baris saja kalau nanti perlu ditambah.
Baca nilai dengan dot notation atau bracket notation:
print(player.name) -- Keiko
print(player["level"]) -- 7player.name dan player["name"] itu sama
persis. Pakai dot notation untuk kata biasa; pakai bracket kalau
kuncinya ada di dalam variabel atau mengandung spasi:
local field = "hp"
print(player[field]) -- 95 -- dot tidak akan bekerja di siniMenambah dan mengubah field
Assign ke kunci yang belum ada akan membuatnya; assign ke kunci yang
sudah ada akan menggantinya; assign nil akan
menghapusnya:
player.mana = 30 -- field baru
player.hp = 100 -- ganti
player.alive = nil -- hapusSetelah tiga baris itu, player menyimpan
name, level, hp,
mana.
Perulangan dengan
pairs
pairs adalah iterator untuk kamus. Ia menghasilkan
setiap kunci dan nilai, dalam urutan yang tidak
tentu:
for key, value in pairs(player) do
print(key, value)
endSetiap field akan tercetak, tapi tidak harus sesuai urutan yang kamu
tulis. Kalau kamu butuh urutan tertentu, simpan kunci-kuncinya di list
dan loop itu — atau pakai ipairs dengan bentuk list
saja.
Pada list, pairs memang menyertakan kunci numerik, tapi
tanpa urutan yang dijamin. Untuk list, selalu gunakan
ipairs; untuk kamus, gunakan pairs.
Memeriksa apakah kunci ada
Kunci yang tidak ada akan dibaca sebagai nil, yang
memberi kamu cara mudah untuk mengecek:
if player.email then
print(player.email)
else
print("No email on file.")
endIni berhasil karena nil bernilai falsy dan nilai apa pun
selain nil bernilai truthy.
Tabel bersarang
Nilai sebuah tabel bisa berupa tabel lain — cara standar untuk membangun data terstruktur:
local player = {
name = "Keiko",
position = { x = 0, y = 5, z = -3 },
inventory = {"sword", "potion", "map"},
}
print(player.position.x) -- 0
print(player.inventory[1]) -- swordDi Roblox, dunia dalam game adalah satu tabel bersarang besar dengan
bentuk seperti ini. game.Players.Keiko.Character hanyalah
rangkaian dot lookup yang menelusuri pohon itu, jadi kemampuan dari bab
ini langsung bisa dipakai.
List dan kamus sekaligus
Satu tabel bisa menyimpan kunci numerik maupun kunci bernama sekaligus:
local quest = {
"Speak to the elder",
"Collect 5 herbs",
"Return to camp",
name = "Healer's Errand",
reward = 50,
}
print(quest.name) -- Healer's Errand
print(quest[1]) -- Speak to the elder
print(#quest) -- 3 (hanya bagian list yang dihitung)# dan ipairs hanya melihat bagian list;
pairs menelusuri semuanya. Kedengarannya rumit tapi
berguna: satu tabel bisa menyimpan sekaligus list item yang berurutan
dan beberapa fakta tambahan tentangnya.
PR
Soal 1 — Data pemain
Buka exercises/23/homework/01-player-record.lua. Buat
sebuah tabel pemain dengan setidaknya empat kunci ini: name
(string), class (string), level (angka),
alive (boolean). Lalu loop dengan
for ... in pairs(...) untuk mencetak setiap kunci dan
nilai, satu per baris.
Soal 2 — Berat inventaris
Buka exercises/23/homework/02-inventory-weights.lua.
Sebuah tabel memetakan nama item ke beratnya (angka). Hitung dan cetak
total beratnya.
Soal 3 — Pencarian aman
Buka exercises/23/homework/03-safe-lookup.lua. Tulis
local function lookup(dict, key) yang mengembalikan
nilainya jika kunci ada, atau string "(not found)" jika
tidak. Uji dengan tiga pemanggilan: satu yang berhasil menemukan, satu
yang tidak, dan satu di mana kuncinya disimpan dalam variabel.
Tantangan — Frekuensi kata
Buka exercises/23/homework/04-word-frequency.lua.
Diberikan sebuah list kata-kata (beberapa berulang), buat kamus yang
memetakan setiap kata unik ke jumlah kemunculannya. Cetak kamus tersebut
satu pasang per baris.
Mentok atau sudah selesai? Buka halaman solusi PR.