Jeśli potrzebujesz nazwanych argumentów i wartości domyślnych, takich jak PHP lub Python, możesz wywołać swoją funkcję za pomocą konstruktora tabeli:
myfunction{a,b=3,c=2}
(Widać to w wielu miejscach w Lua, na przykład w zaawansowanych formach modułów protokołu LuaSocket i konstruktorów w IUPLua ).
Sama funkcja mogłaby mieć taki podpis:
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
Wszelkie wartości brakujące w tabeli parametrów zostaną pobrane z __index
tabeli w jej metatabeli (zobacz dokumentację dotyczącą metatabeli ).
Oczywiście bardziej zaawansowane style parametrów są możliwe przy użyciu konstruktorów tabel i funkcji - możesz napisać wszystko, czego potrzebujesz. Na przykład tutaj jest funkcja, która konstruuje funkcję, która pobiera tabele nazwanych lub pozycyjnych argumentów z tabeli definiującej nazwy parametrów i wartości domyślne oraz funkcję pobierającą zwykłą listę argumentów.
Jako funkcja niezwiązana z językiem, takie wywołania można zmienić, aby zapewnić nowe zachowania i semantykę:
- Zmienne można sprawić, aby akceptowały więcej niż jedną nazwę
- Zmienne pozycyjne i zmienne słów kluczowych mogą być przeplatane - a zdefiniowanie obu może dać pierwszeństwo jednej z nich (lub spowodować błąd)
- Można tworzyć zmienne bez pozycji zawierające tylko słowa kluczowe, a także bezimienne, zawierające tylko pozycje
- Dość rozwlekłą konstrukcję tabeli można wykonać, analizując ciąg
- Lista argumentów może być użyta dosłownie, jeśli funkcja jest wywoływana z czymś innym niż 1 tabela
Niektóre przydatne funkcje do pisania translatorów argumentów to unpack
(przejście do wersji table.unpack
5.2), setfenv
(przestarzałe w wersji 5.2 z nową _ENV
konstrukcją) i select
(które zwraca pojedynczą wartość z podanej listy argumentów lub długość listy z '#'
).