Este patrón le permitirá asignar nombres significativos a cada argumento y proporcionará un valor predeterminado para los argumentos que no se proporcionaron:
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
Como señaló Boris Brodski:
a:0 cuenta el número de argumentos opcionales pasados
a:1, a:2, ... vamos a acceder a los argumentos opcionales
Los argumentos obligatorios (solo fooen el ejemplo anterior) no se cuentan
condition ? result_if_true : result_if_false es la expresión condicional (ternaria), que se evalúa al segundo o tercer término dependiendo de si el primer término era verdadero o no.
Entonces, si no se proporciona un tercer argumento, baztomará el valor predeterminado de 0.
Una preocupación con el ejemplo anterior es que a:foopuede solamente puede acceder con el a:prefijo, mientras que bary bazpuede estar sin un prefijo. Como esto no es muy consistente, puede preferir extraer todos los argumentos en variables locales, de esta manera:
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
(Técnicamente, puede usar el l:prefijo para referirse a variables locales dentro de una función, por ejemplo l:baz, pero esto es redundante, por lo que no lo recomendaría).
Pero le recomiendo que use este formulario siempre que sea posible:
function! s:FunctionName(...)
El le !permite redefinir su función en tiempo de ejecución (por ejemplo, volviendo a cargar el script), y s:limita la función al alcance del script. Eso evita contaminar el espacio de nombres global (y arriesgarse a una colisión) si solo se hace referencia a su función desde otro lugar dentro del script. Generalmente es la forma preferida de definir funciones cuando no es necesario que sean visibles globalmente. ;-)