Si vous voulez des arguments nommés et des valeurs par défaut comme en PHP ou Python, vous pouvez appeler votre fonction avec un constructeur de tableau :
myfunction{a,b=3,c=2}
(On le voit à de nombreux endroits dans Lua, par exemple les formes avancées des modules de protocole de LuaSocket et les constructeurs 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
-- function continues down here...
end
Toutes les valeurs manquantes dans le tableau des paramètres seront prises dans la base de données de l'UE. __index
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 de tableaux et des fonctions - vous pouvez écrire tout ce dont vous avez besoin. Par exemple, ici est une fonction qui construit une fonction prenant des tableaux d'arguments nommés ou positionnels à partir d'un tableau définissant les noms des paramètres et les valeurs par défaut et une fonction prenant une liste d'arguments réguliers.
En tant que fonctionnalité non langagière, ces appels peuvent être modifiés pour offrir de nouveaux comportements et une nouvelle sémantique :
- Les variables peuvent accepter plus d'un nom.
- Les variables positionnelles et les variables mots-clés peuvent être intercalées - et définir les deux peut donner la priorité à l'une ou l'autre (ou provoquer une erreur).
- Il est possible de créer des variables sans position et sans mot-clé, ainsi que des variables sans position et sans nom.
- La construction assez verbeuse de la table pourrait être faite en analysant une chaîne de caractères
- La liste d'arguments pourrait être utilisée textuellement si la fonction est appelée avec autre chose qu'une table 1.
Certaines fonctions utiles pour l'écriture de traducteurs d'arguments sont unpack
(passant à table.unpack
en 5.2), setfenv
(déprécié en 5.2 avec la nouvelle fonction _ENV
construction), et select
(qui renvoie une seule valeur à partir d'une liste d'arguments donnée, ou la longueur de la liste avec la commande '#'
).