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"])    -- 7

player.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 sini

Menambah 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       -- hapus

Setelah 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)
end

Setiap 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.")
end

Ini 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])        -- sword

Di 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.