Si vous voulez des arguments nommés et des valeurs par défaut comme PHP ou Python, vous pouvez appeler votre fonction avec un constructeur de table:
myfunction{a,b=3,c=2}
(Cela se voit dans de nombreux endroits dans Lua, comme les formes avancées des modules de protocole et des constructeurs de LuaSocket dans IUPLua .)
La fonction elle-même pourrait avoir une signature comme celle-ci:
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
Toute valeur manquante dans la table des paramètres sera extraite de la __index
table dans sa métatable (voir la documentation sur les métatables ).
Bien sûr, des styles de paramètres plus avancés sont possibles en utilisant des constructeurs et des fonctions de table - vous pouvez écrire tout ce dont vous avez besoin. Par exemple, voici une fonction qui construit une fonction qui prend des tables d'arguments nommés ou positionnels à partir d'une table définissant les noms de paramètres et les valeurs par défaut et une fonction prenant une liste d'arguments régulière.
En tant que fonctionnalité non au niveau du langage, ces appels peuvent être modifiés pour fournir de nouveaux comportements et sémantiques:
- Les variables peuvent être amenées à accepter plusieurs noms
- Les variables de position et les variables de mot-clé peuvent être intercalées - et définir les deux peut donner la priorité à l'un ou l'autre (ou provoquer une erreur)
- Des variables sans position de mot-clé uniquement peuvent être créées, ainsi que des variables de position sans nom uniquement
- La construction de table assez détaillée pourrait être effectuée en analysant une chaîne
- La liste d'arguments peut être utilisée textuellement si la fonction est appelée avec autre chose qu'une table
Certaines fonctions utiles pour écrire des traducteurs d'arguments sont unpack
(passage à table.unpack
en 5.2), setfenv
(obsolète en 5.2 avec la nouvelle _ENV
construction), et select
(qui renvoie une valeur unique à partir d'une liste d'arguments donnée, ou la longueur de la liste avec '#'
).