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 foo
en 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, baz
tomará el valor predeterminado de 0
.
Una preocupación con el ejemplo anterior es que a:foo
puede solamente puede acceder con el a:
prefijo, mientras que bar
y baz
puede 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. ;-)