Якщо вам потрібні іменовані аргументи та значення за замовчуванням, такі як PHP або Python, ви можете викликати свою функцію за допомогою конструктора таблиці:
myfunction{a,b=3,c=2}
(Це можна побачити в багатьох місцях Lua, наприклад, у вдосконалених формах модулів протоколів LuaSocket та конструкторів в IUPLua .)
Сама функція може мати такий підпис:
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
Будь-які значення, відсутні в таблиці параметрів, будуть взяті з __index
таблиці в її метатаблиці (див . Документацію щодо метатаблиць ).
Звичайно, можливі більш вдосконалені стилі параметрів за допомогою конструкторів таблиць та функцій - ви можете писати все, що вам потрібно. Наприклад, ось функція, яка створює функцію, яка бере таблиці аргументів з іменами або позиціями з таблиці, що визначає імена параметрів та значення за замовчуванням, і функцію, що бере звичайний список аргументів.
Як немовну функцію, такі дзвінки можна змінити, щоб забезпечити нову поведінку та семантику:
- Змінні можуть бути зроблені, щоб прийняти більше одного імені
- Позиційні змінні та змінні ключових слів можуть бути вкраплені - і визначення обох може дати пріоритет будь-якому (або спричинити помилку)
- Можна створювати лише позиційні змінні, що не містять позицій, а також безіменні
- Досить багатослівна побудова таблиці може бути виконана шляхом синтаксичного аналізу рядка
- Список аргументів можна використовувати дослівно, якщо функцію викликати з іншим, ніж 1 таблицею
Деякі корисні функції для написання перекладачів аргументів: unpack
(перехід до table.unpack
пункту 5.2), setfenv
(застарілий у 5.2 з новою _ENV
конструкцією) та select
(який повертає одне значення із заданого списку аргументів або довжину списку з '#'
).