Questo modello ti permetterà di assegnare nomi significativi a ciascun argomento e fornirà un valore predefinito per tutti gli argomenti che non sono stati forniti:
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
Come sottolineato da Boris Brodski:
a:0
conta il numero di argomenti opzionali passati
a:1
, a:2
, ... cerchiamo di accedere agli argomenti opzionali
Gli argomenti obbligatori (solo foo
nell'esempio sopra) non vengono conteggiati
condition ? result_if_true : result_if_false
è l'espressione condizionale (ternaria), che valuta il secondo o il terzo termine a seconda che il primo termine fosse vero o meno.
Quindi, se non viene fornito un terzo argomento, baz
prenderà il valore predefinito di 0
.
Una preoccupazione con l'esempio di cui sopra è che a:foo
può solo essere letta con il a:
prefisso, mentre bar
e baz
può fare a meno di un prefisso. Poiché ciò non è molto coerente, potresti preferire estrarre tutti gli argomenti in variabili locali, in questo modo:
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
(Tecnicamente, puoi usare il l:
prefisso per fare riferimento alle variabili locali all'interno di una funzione, ad esempio l:baz
, ma questo è ridondante, quindi non lo consiglierei.)
Ma ti consiglio di utilizzare questo modulo ogni volta che è possibile:
function! s:FunctionName(...)
Ciò !
consente di ridefinire la funzione in fase di esecuzione (ad esempio ricaricando lo script) e s:
limita la funzione all'ambito dello script. Ciò evita di inquinare lo spazio dei nomi globale (e rischiare la collisione) se alla tua funzione viene fatto riferimento solo da un'altra parte dello script. È generalmente il modo preferito per definire le funzioni quando non devono essere visibili a livello globale. ;-)