यह पैटर्न आपको प्रत्येक तर्क के लिए सार्थक नाम प्रदान करेगा, और प्रदान नहीं किए गए किसी भी तर्क के लिए एक डिफ़ॉल्ट मान प्रदान करेगा:
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:फ़ंक्शन को स्क्रिप्ट गुंजाइश तक सीमित करता है। यदि आपका फ़ंक्शन केवल स्क्रिप्ट के अंदर कहीं और से संदर्भित है, तो वैश्विक नाम स्थान (और टक्कर टकराने) को प्रदूषित करने से बचा जाता है। यह आमतौर पर कार्यों को परिभाषित करने का पसंदीदा तरीका है जब उन्हें विश्व स्तर पर दिखाई देने की आवश्यकता नहीं होती है। ;-)