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 '#'
).
x or default
wyrażenie użyte również w tej odpowiedzi nie jest tak naprawdę prawdziwym odpowiednikiem wartości domyślnych parametrów, ale tylko uproszczonym obejściem, które działa tylko wtedy, gdy obanil
ifalse
są niepoprawnymi wartościami parametrów. Powiedzmy, że domyślnym parametrem boolowskimx
jest,true
a obiekt wywołujący przekazuje jawnefalse
. Następniex or true
dajetrue
, mimo żefalse
został wyraźnie przekazany. Byłaby lepsza wersjaif x == nil then x = default end
, która jest również bardziej czytelna; jednak nadal nie obsługuje jawnychnil
argumentów.Moim zdaniem nie ma innego sposobu. To tylko mentalność Lua: bez fanaberii i poza odrobiną cukru syntaktycznego, bez zbędnych sposobów robienia prostych rzeczy.
źródło
Technicznie rzecz biorąc, jest
b = b == nil and 7 or b
(co powinno być używane w przypadku, gdyfalse
jest to prawidłowa wartość, ponieważ wynosifalse or 7
7), ale prawdopodobnie nie tego szukasz.źródło
false
, prostszym sposobem jest umieszczenie zmiennej jako pierwszej, a domyślnej jako ostatniej.b = b or 7
b = b or 7
).Jedyny sposób, który do tej pory ma sens, to zrobić coś takiego:
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()
źródło