Цей шаблон дозволить призначити значущі імена кожному аргументу та надати значення за замовчуванням для будь-яких аргументів, які не були надані:
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:
обмежує функцію області скрипта. Це дозволяє уникнути забруднення глобального простору імен (і ризикує зіткнутись), якщо на вашу функцію посилаються лише з інших місць сценарію. Зазвичай це кращий спосіб визначення функцій, коли вони не потребують глобальної видимості. ;-)