22. Tabel sebagai Daftar

Sebuah tabel adalah satu-satunya struktur data bawaan yang dimiliki Lua. Tergantung bagaimana kamu menggunakannya, tabel yang sama bisa menyimpan daftar nilai, kumpulan pasangan kunci-nilai, atau keduanya. Bab ini membahas bentuk daftar; bab berikutnya membahas bentuk kamus.

Membuat sebuah daftar

Daftar adalah tabel dengan nilai yang disimpan di bawah kunci 1, 2, 3, dan seterusnya. Cara paling mudah membuatnya adalah dengan kurung kurawal:

local fruits = {"apple", "banana", "cherry"}
print(fruits[1])   -- apple
print(fruits[2])   -- banana
print(fruits[3])   -- cherry

Dua hal yang mungkin mengejutkan kalau kamu sudah pernah melihat bahasa lain:

  • Indeks dimulai dari 1, bukan 0. Item pertama ada di [1]. Roblox mengikuti konvensi yang sama.
  • Kurung siku [...] digunakan untuk mengambil nilai; angka di dalamnya adalah indeksnya.

Variabel fruits menyimpan referensi ke tabel tersebut. Nilai-nilai di dalam kurung kurawal menjadi item di posisi 1, 2, 3.

Panjang dengan #

Operator # yang sama yang kamu gunakan untuk string juga bekerja pada daftar. Operator ini mengembalikan jumlah item:

local fruits = {"apple", "banana", "cherry"}
print(#fruits)   -- 3
print(fruits[#fruits])   -- cherry  (yang terakhir)

fruits[#fruits] membaca nilai di posisi yang sama dengan panjang daftar — yaitu yang terakhir. Ini adalah pola yang umum digunakan.

Mengulang melalui daftar

Ada dua cara alami untuk menelusuri sebuah daftar.

for numerik

Kalau kamu hanya butuh item-itemnya, for numerik dari 1 sampai #t sudah cukup:

for i = 1, #fruits do
    print(i, fruits[i])
end

Keluaran:

1   apple
2   banana
3   cherry

ipairs

ipairs adalah iterator bawaan yang menghasilkan indeks dan nilai secara berurutan, mulai dari 1:

for index, value in ipairs(fruits) do
    print(index, value)
end

Keluarannya sama. ipairs lebih idiomatis untuk daftar karena membuat maksud — iterasi berurutan — menjadi jelas.

Buka exercises/22/01-list-loop.lua. Tambahkan buah keempat lalu jalankan lagi. #fruits dan perulangan keduanya harus menyesuaikan secara otomatis.

Menambah dan menghapus item

Dua cara untuk menambahkan item ke akhir daftar:

local fruits = {"apple", "banana"}

table.insert(fruits, "cherry")    -- menambahkan ke akhir
fruits[#fruits + 1] = "date"      -- juga menambahkan ke akhir; cara manual

print(fruits[3])   -- cherry
print(fruits[4])   -- date

table.insert(t, pos, value) menyisipkan di posisi pos dan menggeser item setelahnya ke kanan:

table.insert(fruits, 1, "apricot")  -- item pertama yang baru
print(fruits[1])   -- apricot
print(fruits[2])   -- apple  (digeser dari 1 ke 2)

table.remove(t, pos) menghapus nilai di posisi pos dan menggeser item setelahnya ke kiri. Tanpa pos, fungsi ini menghapus yang terakhir:

table.remove(fruits, 1)   -- menghapus "apricot"
table.remove(fruits)      -- menghapus item terakhir yang baru

Mengisi sebuah slot dengan nil (fruits[2] = nil) tidak menggeser item setelahnya; ini meninggalkan lubang di dalam daftar. Setelah itu, #fruits dan ipairs mungkin berhenti menghitung di lubang tersebut. Gunakan table.remove untuk menghapus nilai dengan bersih.

Tabel diteruskan melalui referensi

Tabel berperilaku berbeda dari angka dan string dalam satu hal penting: menetapkan tabel ke variabel lain tidak membuat salinannya.

local a = {1, 2, 3}
local b = a       -- b merujuk ke tabel yang SAMA
b[1] = 99
print(a[1])       -- 99   (perubahan terlihat melalui a juga)

Baik a maupun b merujuk ke satu tabel yang sama. Untuk salinan yang sesungguhnya kamu harus mengulang dan membangun tabel baru — tidak ada table.copy bawaan. Kamu jarang membutuhkannya.

PR

Soal 1 — Game favorit

Buka exercises/22/homework/01-favourite-games.lua. Buat daftar berisi lima nama game. Dengan perulangan for ... in ipairs(...) do, cetak masing-masing seperti 1. Roblox, 2. Minecraft, dan seterusnya.

Soal 2 — Jumlahkan daftar

Buka exercises/22/homework/02-sum-list.lua. Sebuah daftar angka sudah dideklarasikan di bagian atas. Hitung dan cetak jumlah totalnya.

Soal 3 — Sisipkan dan hapus

Buka exercises/22/homework/03-insert-remove.lua. Starter memiliki sebuah daftar pendek. Lakukan empat hal, cetak daftar lengkap setelah setiap langkah:

  1. Tambahkan item baru ke akhir.
  2. Sisipkan item lain di posisi 1.
  3. Hapus item terakhir.
  4. Hapus item di posisi 2.

Tantangan — Balik sebuah daftar

Buka exercises/22/homework/04-reverse.lua. Definisikan sebuah local function reverse(list) yang mengembalikan daftar baru dengan item-item yang dibalik, tanpa mengubah daftar aslinya. Uji pada daftar string dan cetak keduanya sebelum dan sesudah.

Kesulitan atau sudah selesai? Buka halaman solusi PR.