Esse padrão permitirá atribuir nomes significativos a cada argumento e fornecer um valor padrão para todos os argumentos que não foram fornecidos:
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 apontado por Boris Brodski:
a:0
conta o número de argumentos opcionais transmitidos
a:1
, a:2
, ... vamos acessar os argumentos opcionais
Os argumentos obrigatórios (apenas foo
no exemplo acima) não são contados
condition ? result_if_true : result_if_false
é a expressão condicional (ternária), avaliada para o segundo ou terceiro termo, dependendo se o primeiro termo era verdadeiro ou não.
Portanto, se nenhum terceiro argumento for fornecido, baz
assumirá o valor padrão de 0
.
Uma preocupação com o exemplo acima é que sóa:foo
pode ser acessado com o prefixo, enquanto e pode ser feito sem um prefixo. Como isso não é muito consistente, você pode preferir extrair todos os argumentos para variáveis locais, como:a:
bar
baz
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, você pode usar o l:
prefixo para se referir a variáveis locais dentro de uma função, por exemplo l:baz
, mas isso é redundante, portanto eu não o recomendaria.)
Mas eu recomendo que você use este formulário sempre que possível:
function! s:FunctionName(...)
O !
permite redefinir sua função no tempo de execução (por exemplo, recarregando o script) e s:
limita a função ao escopo do script. Isso evita poluir o espaço para nome global (e arriscar colisão) se sua função for referenciada apenas de outro lugar dentro do script. Geralmente, é a maneira preferida de definir funções quando elas não precisam ser visíveis globalmente. ;-)