• Tidak ada hasil yang ditemukan

Tabel library meliputi alat bantu fungsi untuk memanipulasi tabel sebagai array. Salah satu peran utamanya memberi suatu arti layak untuk ukuran dari suatu array di dalam Lua. Disamping Itu juga menyediakan fungsi untuk memasukkan/menyisipkan dan memindahkan elemen-elemen dari list dan untuk mengurutkan elemen-elemen dari suatu array.

19.1 Ukuran Array

Pada Lua, kami sering berasumsi bahwa akhir dari suatu array adalah tepat sebelum elemen kosong pertama nya. Konvensi ini mempunyai satu kelemahan yaitu kami tidak bisa memiliki suatu elemen kosong di dalam suatu array. Untuk beberapa aplikasi, pembatasan ini bukanlah suatu

masalah, seperti ketika semua unsur-unsur di dalam array merupakan suatu jenis yang telah ditetapkan. Tetapi kadang-kadang kami harus memasukkan elemen kosong di dalam suatu array. Dalam kasus yang demikian , kami memerlukan suatu metoda untuk menyimpan suatu ukuran eksplisit untuk suatu array.

Table library menggambarkan dua fungsi untuk memanipulasi ukuran array yaitu getn yang mengembalikan ukuran dari suatu array, dan setn yang menetapkan ukuran dari suatu array. Seperti yang telah kami ketahui, ada dua metoda untuk mengasosiasikan suatu atribut kepada suatu tabel yaitu dengan menyimpan atribut di dalam suatu field dari table, atau dengan menggunakan suatu tabel terpisah. Kedua metoda tersebut mempunyai kebaikan dan kelemahan, untuk itu, table library

menggunakan keduanya.

Pada umumnya, suatu panggilan table.setn(t, n) menghubungkan t dengan n di dalam suatu tabel internal dan suatu panggilan table.getn(t) akan mendapat kembali nilai hubungan dengan t di dalam tabel internal tersebut . Jika tabel t mempunyai suatu field " n" dengan suatu nilai numerik, setn akan memperbaharui nilai tersebut dan getn mengembalikannya. Fungsi Getn mempunyai suatu default yaitu jika tidak mendapatkan ukuran array dengan semua pilihan , maka akan menggunakan pendekatan yang sebenarnya untuk memeriksaarray dan mencari elemen nol pertama nya. Maka, kami menggunakan table.getn(t) pada suatu array dan mendapatkan suatu hasil yang benar. Lihatlah contoh :

print(table.getn{10,2,4}) --> 3 print(table.getn{10,2,nil}) --> 2 print(table.getn{10,2,nil; n=3}) --> 3 print(table.getn{n=1000}) --> 1000 a = {} print(table.getn(a)) --> 0 table.setn(a, 10000) print(table.getn(a)) --> 10000 a = {n=10} print(table.getn(a)) --> 10 table.setn(a, 10000) print(table.getn(a)) --> 10000

Sebagai default, setn dan getn menggunakan tabel internal untuk menyimpan ukuran. Ini

merupakan pilihan yang paling tepat karena tidak mengotori array dengan suatu elemen ekstra.

Bagaimanapun, n-field pilihan juga mempunyai beberapa keuntungan. Lua core menggunakan

pilihan ini untuk menetapkan ukuran dari arg array dalam fungsi dengan variabel jumlah argumentasi (karena core tidak bisa tergantung pada satu library, maka tidak bisa menggunakan setn). Keuntungan lain dari pilihan ini adalah bahwa kami bisa menetapkan ukuran dari suatu array secara langsung dalam pembangun (construktor) nya , seperti pada contoh tersebut.

Merupakan suatu praktek yang baik jika menggunakan setn dan getn untuk memanipulasi ukuran array, bahkan ketika kami mengetahui bahwa ukurannya adalah n. Semua fungsi dari table library ( sort, concat, insert, dll.) mengikuti praktek ini. Kenyataannya, kemungkinan setn untuk berubah nilai dari n, disajikan hanya untuk mencocokan dengan versi Lua yang lebih tua. Hal ini bisa saja berubah pada versi selanjutnya. Agar aman, jangan menggunakannya. Selalu gunakan getn untuk mendapatkan suatu ukuran yang diatur oleh setn.

19.2 Insert dan Remove

Tabel library menyediakan fungsi untuk memasukkan/menyisipkan dan untuk memindahkan elemen-elemen di posisi sembarang dari suatu daftar. Fungsi table.insert memasukkan/menyisipkan suatu elemen di dalam posisi yang telah ditentukan dari suatu array, menaikan elemen-elemen lain menuju ruang kosong. Lebih dari itu, fungsi insert menaikan ukuran dari array ( menggunakan setn). Sebagai contoh, jika a adalah array { 10, 20, 30}, setelah panggilan tabel.insert(a, 1, 15) a

akan menjadi { 15, 10, 20, 30}. Sebagai kasus khusus , jika kami memanggil insert tanpa suatu posisi, maka akan memasukkan/menyisipkan pada posisi terakhir ( sehingga tidak memindahkan elemen). Sebagai suatu contoh, kode berikut membaca input baris demi baris, menyimpan semua input pada suatu array:

a = {}

for line in io.lines() do table.insert(a, line) end

print(table.getn(a)) --> (number of lines read)

Fungsi Table.Remove memindahkan ( dan mengembalian ) suatu elemen dari posisi yang ditentukan di dalam suatu array, memindahkan elemen-elemen lain untuk menutup ruang/space

sehingga ukuran dari array berkurang. Ketika dipanggil tanpa suatu posisi, maka akan memindahkan elemen array terakhir.

Dengan dua fungsi tersebut , secara langsung kami menerapkan stacks, antrian, dan antrian ganda. Kami dapat menginisialkan struktur sebagai a ={}, table.insert(a, x) mewakili operasi push, table.remove(a) mewakili suatu operasi pop. Untuk memasukkan/menyisipkan di akhir lain dari struktur kami menggunakan table.insert(a, 1, x), untuk memindahkan elemen array dari dari posisi akhir, kami menggunakan table.remove(a, 1).Dua operasi terakhir sangat tidak efisien karena kami harus memindahkan unsur-unsur naik turun. Karena table library mengimplementasikan fungsi ini pada C, pengulangan ini tidak terlalu mahal dan implementasinya cukup baik untuk array dengan ukuran kecil ( sampai beberapa ratus elemen).

19.3 Sort

Fungsi lain yang berguna pada array adalah table.sort, yang sudah ada sebelumnya. table.sort menerima array untuk disortir, ditambah suatu fungsi order opsional. Fungsi order ini menerima dua argumentasi dan harus mengembalikan true jika argumentasi pertama masuk pertama kali di dalam array yang disortir. Jika tidak, sort menggunakan default operasi kurang dari ( sesuai dengan operator `<´ ).

Suatu kesalahan lain adalah mencoba untuk memesan indeks suatu tabel. Di dalam suatu tabel, indeks membentuk set, dan tidak mempunyai order apapun. Jika kami ingin memesan, kami harus mengkopinya ke suatu array dan kemudian mengurutkan array tersebut. Bayangkan bahwa kami membaca suatu sumber file dan membangun suatu tabel yang telah ditentukan untuk masing- masing nama fungsi, seperti :

lines = { luaH_set = 10, luaH_get = 24, luaH_present = 48, }

Sekarang kami ingin mencetak nama fungsi ini menurut abjad. Jika kami menelusuri tabel ini dengan pairs, nama tersebut akan terlihat sebagai sembarang order. Bagaimanapun, kami tidak bisa mengurutkannya secara langsung, sebab nama ini merupakan kunci dari tabel. Ketika kami meletakkan nama ini ke dalam suatu array, maka kemudian kami dapat mengurutkannya. Pertama, kami harus menciptakan suatu array dengan nama tersebut, kemudian mengurutkannya, dan akhirnya mencetak hasilnya:

a = {}

for n in pairs(lines) do table.insert(a, n) end table.sort(a)

for i,n in ipairs(a) do print(n) end

Pada Lua, array tidak memiliki order. Tetapi kami mengetahui bagaimana cara menghitungnya, maka kami bisa mendapatkan nilai-nilai yang dipesan sepanjang kami mengakses array dengan indeks yang dipesan. Disinilah mengapa kami perlu selalu menelusurig array dengan ipairs, dibanding pairs. Pertama menentukan kunci order 1, 2,..., menggunakan sembarang order dari tabel.

Sebagai solusi yang lebih baik, kami dapat menulis suatu iterator yang menelusuri suatu tabel mengikuti order dari kuncinya . Suatu parameter opsional f mengijinkan spesifikasi dari suatu order alternatif. Pertama mengurutkan kunci ke dalam suatu array, kemudian terjadi perulangan pada array tersebut. Pada masing-masing langkah, akan mengembalikan kunci dan nilai dari tabel yang asli:

function pairsByKeys (t, f) local a = {}

for n in pairs(t) do table.insert(a, n) end

table.sort(a, f) local i = 0 -- iterator variable

local iter = function () -- iterator function i = i + 1

if a[i] == nil then return nil else return a[i], t[a[i]]

end end

return iter end

Dengan fungsi ini ,mudah untuk mencetak nama dari fungsi menurut abjad :

for name, line in pairsByKeys(lines) do print(name, line) end akan mencetak : luaH_get 24 luaH_present 48 luaH_set 10