Jika Anda ingin argumen bernama dan nilai default seperti PHP atau Python, Anda dapat memanggil fungsi Anda dengan konstruktor tabel:
myfunction{a,b=3,c=2}
(Ini terlihat di banyak tempat di Lua, seperti bentuk lanjutan dari modul protokol dan konstruktor LuaSocket di IUPLua .)
Fungsi itu sendiri bisa memiliki tanda tangan seperti ini:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
end
Setiap nilai yang hilang dari tabel parameter akan diambil dari __index
tabel di metatabelnya (lihat dokumentasi tentang tabel metatabel ).
Tentu saja, gaya parameter yang lebih canggih dapat dilakukan dengan menggunakan konstruktor dan fungsi tabel - Anda dapat menulis apa pun yang Anda butuhkan. Misalnya, berikut adalah fungsi yang membangun fungsi yang mengambil tabel argumen bernama-atau-posisi dari tabel yang mendefinisikan nama parameter dan nilai default dan fungsi yang mengambil daftar argumen biasa.
Sebagai fitur tingkat non-bahasa, panggilan tersebut dapat diubah untuk memberikan perilaku dan semantik baru:
- Variabel dapat dibuat untuk menerima lebih dari satu nama
- Variabel posisi dan variabel kata kunci dapat diselingi - dan mendefinisikan keduanya dapat mendahulukan (atau menyebabkan kesalahan)
- Variabel tanpa posisi hanya kata kunci dapat dibuat, serta variabel khusus posisi tanpa nama
- Konstruksi tabel yang cukup bertele-tele dapat dilakukan dengan mengurai string
- Daftar argumen dapat digunakan secara verbatim jika fungsinya dipanggil dengan sesuatu selain 1 tabel
Beberapa fungsi yang berguna untuk menulis penerjemah argumen adalah unpack
(pindah ke table.unpack
5.2), setfenv
(usang di 5.2 dengan _ENV
konstruksi baru ), dan select
(yang mengembalikan satu nilai dari daftar argumen yang diberikan, atau panjang daftar dengan '#'
).
x or default
ekspresi yang juga digunakan dalam balasan ini sebenarnya tidak setara dengan parameter default tetapi hanya solusi sederhana yang hanya berfungsi jika keduanyanil
danfalse
merupakan nilai parameter yang tidak valid. Misalkan default untuk parameter booleanx
adalahtrue
dan pemanggil meneruskan eksplisitfalse
. Kemudianx or true
memberitrue
, meskipunfalse
secara eksplisit disahkan. Versi yang lebih baik adalahif x == nil then x = default end
, yang juga lebih mudah dibaca; itu masih tidak bisa menanganinil
argumen eksplisit .Menurut saya tidak ada cara lain. Itu hanya mentalitas Lua: tanpa embel-embel, dan kecuali beberapa gula sintaksis, tidak ada cara yang berlebihan untuk melakukan hal-hal sederhana.
sumber
Secara teknis, ada
b = b == nil and 7 or b
(yang harus digunakan dalam kasus di manafalse
ada nilai yang valid seperti yangfalse or 7
dievaluasi ke 7), tetapi itu mungkin bukan yang Anda cari.sumber
false
, cara yang lebih sederhana adalah menempatkan variabel terlebih dahulu dan default terakhir.b = b or 7
b = b or 7
).Satu-satunya cara yang saya temukan sejauh ini yang masuk akal adalah dengan melakukan sesuatu seperti ini:
function new(params) params = params or {} options = { name = "Object name" } for k,v in pairs(params) do options[k] = v end some_var = options.name end new({ name = "test" }) new()
sumber