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 '#'
).
x or default
expression également utilisée dans cette réponse n'est pas vraiment un véritable équivalent aux paramètres par défaut, mais simplement une solution de contournement simpliste qui ne fonctionne que si les deuxnil
etfalse
sont des valeurs de paramètre non valides. Disons que la valeur par défaut pour un paramètre booléenx
esttrue
et que l'appelant transmet un explicitefalse
. Puisx or true
donnetrue
, même si afalse
été explicitement adopté. Une meilleure version seraitif x == nil then x = default end
, qui est également plus lisible; il ne peut toujours pas gérer lesnil
arguments explicites .À mon avis, il n'y a pas d'autre moyen. C'est juste la mentalité Lua: pas de fioritures, et à l'exception de quelques sucres syntaxiques, pas de façons redondantes de faire des choses simples.
la source
Techniquement, il y a
b = b == nil and 7 or b
(qui devrait être utilisé dans le cas oùfalse
une valeur valide estfalse or 7
évaluée à 7), mais ce n'est probablement pas ce que vous recherchez.la source
false
, un moyen plus simple consiste à placer la variable en premier et la valeur par défaut en dernier.b = b or 7
b = b or 7
).Le seul moyen que j'ai trouvé jusqu'à présent qui ait du sens est de faire quelque chose comme ceci:
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()
la source