Я хочу сделать функцию, которая имеет необязательные аргументы.
В Python я бы сделал что-то вроде этого:
def functionName(arg1,arg2=false,arg3=false):
if arg2:
#Do stuff with arguments
else:
#Do stuff without arguments
Я пытался сделать function FunctionName(arg1,arg2=false,arg3=false)
, но это просто дает мне ошибку, говоря неверный аргумент.
Как бы я сделал это в Vimscript?
let a:arg=
больше делать в Vim. Вы должны использовать что-то вродеlet l:arg=
или простоlet arg=
. См github.com/vim/vim/commit/...Этот шаблон позволит вам присвоить значимые имена каждому аргументу и предоставить значение по умолчанию для любых аргументов, которые не были предоставлены:
Как отметил Борис Бродский:
condition ? result_if_true : result_if_false
является условным (троичным) выражением, которое оценивает второй или третий член в зависимости от того, был ли первый член истинным или нет.Так что, если третий аргумент не предоставлен,
baz
примет значение по умолчанию0
.Одна из проблем , с приведенным выше примером является то , что
a:foo
может только быть доступны сa:
префиксом, в то время какbar
иbaz
может обойтись без префикса. Поскольку это не очень согласованно, вы можете предпочесть вытянуть все аргументы в локальные переменные, например, так:(Технически вы можете использовать
l:
префикс, например, для ссылки на локальные переменные внутри функцииl:baz
, но это избыточно, поэтому я бы не рекомендовал его.)Но я рекомендую вам использовать эту форму всякий раз, когда это возможно:
!
Позволяет переопределить ваши функции во время выполнения (например , путем перезагрузки скрипта), иs:
ограничивает функцию области скрипта. Это исключает загрязнение глобального пространства имен (и риск столкновения), если на вашу функцию ссылаются только из других мест внутри скрипта. Обычно это предпочтительный способ определения функций, когда они не должны быть видны глобально. ;-)источник
a:0
не включает в себя фиксированные именованные параметры.a:1
является первым параметром в...
(Только что протестирован с VIM 8.0)Я не очень хорошо разбираюсь в vimscript, но вот как бы я это сделал:
Затем вы можете
call Func("Hello", "World")
увидеть, что он печатает «Hello», «World», «Unspecified baz».Это использует функцию varargs функций vim, которая позволяет передавать произвольное количество дополнительных аргументов функции. Аргументы хранятся в переменных, которые, в зависимости от
a:0
(длина списка дополнительных аргументов), либо устанавливаются в соответствующие аргументы, либо в значение по умолчанию.источник
Начиная с Vim 8.1.1310, Vim также поддерживает реальные необязательные аргументы функций.
Однако это означает, что большинство установок vim пока не поддерживают это. Также neovim также не предлагает эту функцию.
Пример из
:help optional-function-argument
:источник