Этот шаблон позволит вам присвоить значимые имена каждому аргументу и предоставить значение по умолчанию для любых аргументов, которые не были предоставлены:
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
Как отметил Борис Бродский:
a:0
подсчитывает количество переданных необязательных аргументов
a:1
, a:2
... давайте доступ необязательные аргументы
Обязательные аргументы (как foo
в примере выше) не учитываются
condition ? result_if_true : result_if_false
является условным (троичным) выражением, которое оценивает второй или третий член в зависимости от того, был ли первый член истинным или нет.
Так что, если третий аргумент не предоставлен, baz
примет значение по умолчанию 0
.
Одна из проблем , с приведенным выше примером является то , что a:foo
может только быть доступны с 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
(Технически вы можете использовать l:
префикс, например, для ссылки на локальные переменные внутри функции l:baz
, но это избыточно, поэтому я бы не рекомендовал его.)
Но я рекомендую вам использовать эту форму всякий раз, когда это возможно:
function! s:FunctionName(...)
!
Позволяет переопределить ваши функции во время выполнения (например , путем перезагрузки скрипта), и s:
ограничивает функцию области скрипта. Это исключает загрязнение глобального пространства имен (и риск столкновения), если на вашу функцию ссылаются только из других мест внутри скрипта. Обычно это предпочтительный способ определения функций, когда они не должны быть видны глобально. ;-)