Ten wzorzec pozwoli ci przypisać znaczące nazwy do każdego argumentu i zapewni domyślną wartość dla wszystkich argumentów, które nie zostały podane:
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
Jak zauważył Boris Brodski:
a:0
zlicza liczbę przekazanych opcjonalnych argumentów
a:1
, a:2
... niech nam dostęp do argumentów opcjonalnych
Obowiązkowe argumenty (tylko foo
w powyższym przykładzie) nie są liczone
condition ? result_if_true : result_if_false
to wyrażenie warunkowe (trójskładnikowe), które ocenia na drugi lub trzeci warunek w zależności od tego, czy pierwszy warunek był prawdziwy, czy nie.
Więc jeśli nie zostanie podany trzeci argument, baz
przyjmie wartość domyślną 0
.
Jednym z problemów z powyższym przykładzie jest to, że a:foo
może jedynie być dostępne z a:
prefiksem, a jednocześnie bar
i baz
może się obejść bez prefiksu. Ponieważ nie jest to bardzo spójne, możesz chcieć wyciągnąć wszystkie argumenty do zmiennych lokalnych, na przykład:
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
(Technicznie rzecz biorąc, możesz użyć l:
przedrostka, aby na przykład odwołać się do zmiennych lokalnych wewnątrz funkcji l:baz
, ale jest to zbędne, więc nie poleciłbym tego.)
Ale zalecam korzystanie z tego formularza, gdy tylko jest to możliwe:
function! s:FunctionName(...)
!
Pozwala przedefiniować swoją funkcję w czasie wykonywania (np przez przeładowywania scenariusz) oraz s:
ogranicza zakres funkcji do skryptu. Pozwala to uniknąć zanieczyszczenia globalnej przestrzeni nazw (i ryzyka kolizji), jeśli do funkcji odwołuje się tylko z innego miejsca w skrypcie. Jest to ogólnie preferowany sposób definiowania funkcji, gdy nie muszą być one widoczne na całym świecie. ;-)