Pola ini akan memungkinkan Anda menetapkan nama yang bermakna untuk setiap argumen, dan memberikan nilai default untuk setiap argumen yang tidak disediakan:
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
Seperti yang ditunjukkan oleh Boris Brodski:
a:0
menghitung jumlah argumen opsional yang diteruskan
a:1
,, a:2
... mari kita mengakses argumen opsional
Argumen wajib (hanya foo
dalam contoh di atas) tidak dihitung
condition ? result_if_true : result_if_false
adalah ekspresi kondisional (ternary), yang mengevaluasi ke istilah kedua atau ketiga tergantung pada apakah istilah pertama itu benar atau tidak.
Jadi jika tidak ada argumen ketiga yang diberikan, baz
akan mengambil nilai default 0
.
Salah satu perhatian dengan contoh di atas adalah bahwa a:foo
dapat hanya diakses dengan a:
awalan, sementara bar
dan baz
dapat melakukannya tanpa prefiks. Karena ini tidak terlalu konsisten, Anda dapat memilih untuk menarik semua argumen ke dalam variabel lokal, seperti:
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
(Secara teknis, Anda dapat menggunakan l:
awalan untuk merujuk ke variabel lokal di dalam suatu fungsi, misalnya l:baz
, tetapi ini berlebihan sehingga saya tidak akan merekomendasikannya.)
Tetapi saya merekomendasikan Anda untuk menggunakan formulir ini jika memungkinkan:
function! s:FunctionName(...)
The !
memungkinkan Anda untuk mendefinisikan kembali fungsi Anda saat runtime (misalnya dengan reload script), dan s:
membatasi fungsi untuk lingkup naskah. Itu menghindari polusi namespace global (dan mempertaruhkan tabrakan) jika fungsi Anda hanya dirujuk dari tempat lain di dalam skrip. Ini umumnya merupakan cara yang lebih disukai untuk mendefinisikan fungsi ketika mereka tidak perlu terlihat secara global. ;-)