Topik ini membahas table, satu-satunya struktur data bawaan Lua yang menampung peran array, kamus (dictionary), catatan berlabel, dan bentuk kumpulan lainnya. Materi mencakup konstruktor, cara akses elemen, table bersarang, semantik penugasan table, operator #, dan penghapusan kunci. Setelah menyelesaikannya, data program dapat ditata ke dalam table dengan bentuk yang tepat.
Konstruktor table#
Konstruktor table membentuk nilai table baru dari daftar elemen yang diapit tanda kurung kurawal. Bentuk pertama adalah gaya list, yaitu deretan nilai yang dipisahkan koma, dan gaya ini mengisi kunci bilangan secara otomatis mulai dari 1. Bentuk kedua adalah gaya record, yaitu pasangan nama = nilai, yang menugaskan kunci bernama kepada setiap elemennya.
-- Konstruktor gaya list mengisi kunci bilangan mulai dari 1
local nilai = {88, 92, 79}
print(nilai[1])
print(nilai[3])88
79-- Konstruktor gaya record menugaskan kunci bernama
local siswa = { nama = "Ali", nilai = 90 }
print(siswa.nama)
print(siswa["nilai"])Ali
90Kedua gaya boleh dicampur dalam satu konstruktor. Bagian gaya list tetap menempati kunci bilangan mulai dari 1, sedangkan bagian bernama menempati kunci string masing-masing. Perhatikan bahwa indeks terkecilnya adalah 1 dan bukan 0, sehingga elemen pertama selalu dibaca dengan [1].
-- Konstruktor dapat mencampur bagian list dan record sekaligus
local laporan = { "Ujian tengah semester", kelas = "7A", jumlahSiswa = 30 }
print(laporan[1])
print(laporan.kelas)
print(laporan.jumlahSiswa)Ujian tengah semester
7A
30Konstruktor ini menjadi alat pembentuk data utama pada program Lua. Pemilihan gaya mengikuti bentuk datanya, yaitu gaya list untuk kumpulan sejenis yang berurutan dan gaya record untuk kumpulan dengan label bermakna. Deretan skor, catatan siswa, jadwal piket, dan daftar belanja semuanya dibentuk dengan satu sintaks yang sama, dan pembedanya hanya terletak pada cara pemilihan kuncinya.
Akses elemen dan ragam kunci#
Elemen table dibaca dan ditulis dengan tanda kurung siku, yaitu t[k] untuk kunci k. Lua menyediakan bentuk singkat t.k yang setara dengan t["k"], dengan syarat kunci stringnya merupakan pengenal yang sah. Bentuk titik tidak dapat digunakan untuk kunci bilangan, kunci yang memuat spasi, maupun kunci bukan string, sehingga tanda kurung siku tetap menjadi bentuk yang paling umum.
-- Kunci table dapat berupa berbagai tipe nilai
local data = {}
data[1] = "kunci bilangan"
data["nama"] = "Budi"
data[true] = "kunci boolean"
print(data[1])
print(data["nama"])
print(data[true])kunci bilangan
Budi
kunci booleanKunci table dapat berupa nilai apa pun kecuali nil, sehingga bilangan, string, boolean, fungsi, dan table lain semuanya sah sebagai kunci. Dua kunci dianggap sama apabila nilainya sama, sehingga penulisan data["nama"] dan data.nama menunjuk satu elemen yang sama. Keluaran di atas menegaskan bahwa kunci berbeda tipe menyimpan nilai masing-masing tanpa saling mengganggu, meskipun kunci string tetap menjadi pilihan yang paling mudah dibaca.
Table bersarang#
Nilai dalam satu table boleh berupa table lain, sehingga struktur data bertingkat terbentuk secara alami. Catatan satu siswa berupa table gaya record, dan catatan seluruh kelas berupa table gaya list yang setiap elemennya adalah catatan siswa. Akses bertingkat ditulis berurutan, misalnya kelas[2].nama untuk membaca nama siswa kedua.
Berkas berikut membentuk daftar kelas dari tiga table bersarang, menelusurinya dengan ipairs, lalu membaca satu elemen secara langsung.
-- Table bersarang menampung catatan beberapa siswa sekaligus
local kelas = {
{ nama = "Ali", nilai = 88 },
{ nama = "Budi", nilai = 92 },
{ nama = "Citra", nilai = 79 },
}
for i, siswa in ipairs(kelas) do
print(i, siswa.nama, siswa.nilai)
end
print(kelas[2].nama)1 Ali 88
2 Budi 92
3 Citra 79
BudiKeluaran menampilkan tiga baris berpasangan indeks, nama, dan nilai, kemudian satu baris Budi dari pembacaan langsung kelas[2].nama. Pola table bersarang seperti ini mewakili sebagian besar data nyata pada program Lua, mulai dari catatan siswa, jadwal piket berisi nama pengikutnya, hingga pengaturan aplikasi yang bertingkat.
Table sebagai nilai acuan#
table adalah nilai acuan (reference value), yaitu nilai yang dipegang melalui acuan menuju data aslinya, bukan melalui salinannya. Penugasan satu table ke variabel lain menyalin acuannya saja, sehingga kedua variabel menunjuk data yang sama. Perubahan yang dilakukan melalui satu nama langsung terlihat melalui nama lainnya.
Diagram berikut menggambarkan dua variabel yang menunjuk satu data table yang sama setelah penugasan.
-- Penugasan table menyalin acuan, bukan isi
local asli = { 10, 20, 30 }
local salinan = asli
salinan[1] = 99
print(asli[1])
print(salinan[1])99
99Sifat acuan ini juga menentukan hasil perbandingan. Operator kesamaan == menilai kesamaan acuan, sehingga dua table berisi sama tetap dianggap berbeda apabila keduanya dibentuk secara terpisah.
-- Perbandingan table menilai kesamaan acuan, bukan kesamaan isi
local a = { 1, 2 }
local b = { 1, 2 }
print(a == b)
local c = a
print(a == c)false
trueSifat ini konsisten dengan peran table sebagai struktur data tunggal. Menyalin table besar secara diam-diam pada setiap penugasan akan memboroskan waktu, sehingga Lua memilih penyalinan acuan yang murah dan menyerahkan keputusan menyalin isi kepada penulisnya. Kebiasaan yang menjaga kejelasan adalah memeriksa apakah sebuah variabel benar-benar menunjuk data sendiri sebelum mutasi dilakukan.
Panjang urutan dan penghapusan kunci#
Operator # mengembalikan panjang sebuah urutan (sequence), yaitu bagian table dengan kunci bilangan berurutan mulai dari 1 tanpa celah. Bagian lain dari table yang berkunci nama tidak ikut terhitung, karena operator ini menilai sisi array-nya saja.
-- Operator # menghitung panjang urutan
local belanja = { "gandum", "telur", "minyak" }
print(#belanja)
belanja[3] = nil
print(#belanja)3
2Keluaran 3 mencerminkan tiga elemen berturutan, dan nilai 2 muncul kembali setelah elemen ketiga dihapus. Operator # hanya dapat diandalkan pada urutan tanpa celah, sehingga menghapus elemen terakhir dengan nil tetap meninggalkan urutan yang utuh. Penghapusan pada kunci bernama menggunakan pola yang sama, yaitu penugasan nil, dan kunci yang dihapus menjadi tidak ada lagi di dalam table.
-- Penugasan nil menghapus kunci dari table
local stok = { pensil = 24, buku = 10 }
stok.pensil = nil
print(stok.pensil)
print(stok.buku)nil
10Keluaran nil dan 10 menunjukkan kunci pensil hilang sama sekali, sedangkan kunci lain tetap utuh. Pola penugasan nil sebagai alat penghapus menjadi idiom table yang lazim pada kode Lua, dan pola ini melengkapi konstruksi, pembacaan, serta mutasi yang telah dibahas pada topik ini.
Ringkasan#
- Konstruktor
tablemenyediakan gaya list yang mengisi kunci bilangan mulai dari1, gaya record yang menugaskan kunci bernama, dan keduanya dapat dicampur dalam satu konstruktor. t.ksetara dengant["k"]untuk kunci string berbentuk pengenal, sedangkan kunci lainnya menggunakan tanda kurung siku.tableadalah nilai acuan, sehingga penugasan menyalin acuan dan mutasi terlihat melalui seluruh variabel yang menunjuk data yang sama.- Operator
#menghitung panjang urutan berindeks satu, dan penugasannilmenghapus kunci daritable.
Referensi#
- Referensi Manual Lua 5.4 — Lua.org — Bagian Table Constructors menetapkan bentuk konstruktor, sedangkan bagian Garbage Collection menjelaskan pemulihan memori table yang tidak lagi dirujuk.
- Programming in Lua — Lua.org — Bab struktur data membangun array, matriks, dan kumpulan lain di atas table beserta idiom pengindeksannya.