Mit diesem Muster können Sie jedem Argument einen aussagekräftigen Namen zuweisen und einen Standardwert für alle Argumente angeben, die nicht angegeben wurden:
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
Boris Brodski wies darauf hin:
a:0
zählt die Anzahl der übergebenen optionalen Argumente
a:1
, a:2
, ... lassen Sie uns die optionalen Argumente zugreifen
Die obligatorischen Argumente (nur foo
im obigen Beispiel) werden nicht gezählt
condition ? result_if_true : result_if_false
ist der bedingte (ternäre) Ausdruck, der in Abhängigkeit davon, ob der erste Ausdruck wahr ist oder nicht, als zweiter oder dritter Ausdruck ausgewertet wird.
Wenn also kein drittes Argument angegeben wird, baz
wird der Standardwert von verwendet 0
.
Ein Problem bei dem obigen Beispiel ist , dass a:foo
kann nur mit dem zugegriffen wird a:
Präfix, während bar
und baz
kann ohne Präfix tun. Da dies nicht sehr konsistent ist, können Sie es vorziehen, alle Argumente in lokale Variablen zu ziehen, wie folgt:
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
(Technisch gesehen können Sie das l:
Präfix beispielsweise verwenden, um auf lokale Variablen in einer Funktion zu verweisen. l:baz
Dies ist jedoch redundant, sodass ich es nicht empfehlen würde.)
Ich empfehle Ihnen jedoch, wann immer möglich dieses Formular zu verwenden:
function! s:FunctionName(...)
Dadurch !
können Sie Ihre Funktion zur Laufzeit neu definieren (z. B. durch erneutes Laden des Skripts) und s:
die Funktion auf den Skriptbereich beschränken. Dadurch wird vermieden, dass der globale Namespace verschmutzt wird (und eine Kollision riskiert wird), wenn Ihre Funktion nur von einer anderen Stelle im Skript referenziert wird. Es ist im Allgemeinen die bevorzugte Methode, Funktionen zu definieren, wenn sie nicht global sichtbar sein müssen. ;-)