Argumentasi yang Dikenal
5.3 Argumentasi yang Dikenal
Parameter yang menyampaikan/passing mekanisme di Lua adalah tergantung posisi (positional): Ketika kita memanggil suatu fungsi, argumentasi-argumentasi menyesuaikan parameter-parameter oleh posisi-posisi mereka. Argumentasi yang pertama memberi nilai itu kepada parameter yang pertama, dan seterusnya. Kadang-kadang, bagaimanapun, hal itu berguna untuk menetapkan argumentasi-argumentasi sesuai nama. Untuk mengilustrasikan hal ini, marilah kita menganggap fungsi rename (dari pustaka os), yang memberi nama baru /rename file. Sering kali, kita melupakan nama-nama mana yang datang pertama, yang baru, atau yang lama; oleh karena itu, kita mungkin ingin mendefinisikan kembali fungsi ini untuk menerima dua argumentasinya sesuai nama:
-- invalid code rename(old="temp.lua", new="temp1.lua")
Lua tidak memiliki dukungan langsung untuk sintaksis itu, tetapi kita dapat mempunyai pengaruh akhir yang sama, dengan suatu perubahan sintaksis yang kecil. Gagasan disini untuk mengemas semua argumentasi ke dalam suatu table-tabel dan menggunakan table itu sebagai satu- satunya argumentasi pada fungsi. Sintaksis khusus yang Lua sediakan untuk fungsi pemanggilan, dengan hanya satu konstruktor tabel sebagai argumentasi, membantu trik:
rename{old="temp.lua", new="temp1.lua"}
Demikian, kita mendfinisikan rename hanya satu parameter dan mendapat argumentasi- argumentasi yang nyata dari parameter ini: Demikian, kita mendfinisikan rename hanya satu parameter dan mendapat argumentasi- argumentasi yang nyata dari parameter ini:
Gaya/style dari penyampaian/passing parameter terutama sangat menolong ketika fungsi mempunyai banyak parameter, dan kebanyakan mereka bersifat opsional. Sebagai contoh, suatu fungsi yang membuat suatu jendela baru di suatu pustaka GUI mungkin punya lusinan argumentasi- argumentasi, kebanyakan mereka opsional, yang terbaik ditetapkan sesuai nama:
w = Window{ x=0, y=0, width=300, height=200, title = "Lua", background="blue", border = true }
Fungsi Window yang mempunyai kebebasan untuk memeriksa argumentasi-argumentasi wajib, menambahkan nilai asli/default, dan semacamnya. Mengumpamakan suatu nilai primitif fungsi _Window yang benar-benar membuat jendela baru(new window) (dan hal itu memerlukan semua argumentasi), kita bisa mendefinisikan Window sebagai berikut:
function Window (options) -- check mandatory options if type(options.title) ~= "string" then error("no title") elseif type(options.width) ~= "number" then error("no width") elseif type(options.height) ~= "number" then error("no height") end -- everything else is optional _Window(options.title, options.x or 0, -- default value options.y or 0, -- default value options.width, options.height, options.background or "white", -- default
options.border -- default is false (nil) ) end
Latihan
Fungsi MakeDotter function diperlukan untuk mengembalikan suatu yang menambahkan sejumlah N dots ke argmumennya (dan mengembalikan hasilnya). Kode berikut hamper bekerja dengan baik, akan tetapi setiap kali digunakan menghasilkan suatu fungsi dots baru, dots yang lama berhenti bekerja. Mengapa ini terjasi, dan pada satua baris yang manakah kita harus mengubahnya sehingga kode benar-benar bekerja dengan baik?
> function MakeDotter(N) >> Dots = “” >> for I = 1, N do >> Dots = Dots .. “.”
>> end >> return function(Str) >> return Str .. Dots >> end >> end > > -- Make a function that appends one dot to its argument:
> OneDotter = MakeDotter(1) > print(OneDotter(“A”)) A. > print(OneDotter(“B”)) B. > -- Make a function that appends three dots to its argument: > ThreeDotter = MakeDotter(3) > print(ThreeDotter(“C”)) C... > print(ThreeDotter(“D”)) D... > -- OneDotter now appends three dots instead of one: > print(OneDotter(“E”)) E...