106 votes

Définir les valeurs par défaut des arguments de la fonction

Dans le wiki de Lua, j'ai trouvé un moyen de définir des valeurs par défaut pour les arguments manquants :

function myfunction(a,b,c)
    b = b or 7
    c = c or 5
    print (a,b,c)
end

Est-ce le seul moyen ? Le style PHP myfunction (a,b=7,c=5) ne semble pas fonctionner. Non pas que la méthode Lua ne fonctionne pas, je me demande simplement si c'est la seule façon de procéder.

106voto

Stuart P. Bentley Points 2705

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 '#' ).

52voto

jpjacobs Points 6838

À mon avis, il n'y a pas d'autre moyen. C'est juste la mentalité de Lua : pas de fioritures, et à l'exception de quelques sucres syntaxiques, pas de façons redondantes de faire des choses simples.

24voto

Stuart P. Bentley Points 2705

Techniquement, il y a b = b == nil and 7 or b (qui devrait être utilisé dans le cas où false est une valeur valide comme false or 7 évalue à 7), mais ce n'est probablement pas ce que vous recherchez.

9voto

NineBlindEyes Points 116

Le seul moyen que j'ai trouvé jusqu'à présent et qui a 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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X