Ce modèle vous permettra d'attribuer des noms significatifs à chaque argument et de fournir une valeur par défaut pour tous les arguments non fournis:
function FunctionName(foo, ...)
let bar = a:0 >= 1 ? a:1 : 0
let baz = a:0 >= 2 ? a:2 : 0
...
" Code that makes use of a:foo, bar and baz
Comme l'a souligné Boris Brodski:
a:0
compte le nombre d'arguments optionnels passés
a:1
, a:2
... laissez-nous accéder aux arguments optionnels
Les arguments obligatoires (juste foo
dans l'exemple ci-dessus) ne sont pas comptés
condition ? result_if_true : result_if_false
est l'expression conditionnelle (ternaire), qui correspond au deuxième ou au troisième terme selon que le premier terme était vrai ou non.
Donc, si aucun troisième argument n'est fourni, baz
prendra la valeur par défaut de 0
.
Un problème avec l'exemple ci - dessus est que a:foo
peut uniquement accessible avec le a:
préfixe, tout bar
et baz
peut faire sans préfixe. Comme cela n’est pas très cohérent, vous préférerez peut-être extraire tous les arguments en variables locales, comme ceci:
function FunctionName(...)
let foo = a:1 " Will throw an error if no arg was provided
let bar = a:0 >= 2 ? a:2 : 0
let baz = a:0 >= 3 ? a:3 : 0
...
" Code that makes use of foo, bar and baz
(Techniquement, vous pouvez utiliser le l:
préfixe pour faire référence à des variables locales dans une fonction, par exemple l:baz
, mais ceci est redondant, je ne le recommanderais donc pas.)
Mais je vous recommande d'utiliser ce formulaire chaque fois que possible:
function! s:FunctionName(...)
Le !
vous permet de redéfinir votre fonction lors de l' exécution (par exemple en rechargeant le script), et la s:
limite de la fonction portée du script. Cela évite de polluer l'espace de nom global (et le risque de collision) si votre fonction est uniquement référencée ailleurs dans le script. C'est généralement le moyen préféré pour définir des fonctions lorsqu'elles n'ont pas besoin d'être globalement visibles. ;-)