वैकल्पिक तर्कों के साथ विम्सस्क्रिप्ट फ़ंक्शन कैसे करें?


33

मैं एक फ़ंक्शन बनाना चाहता हूं जिसमें वैकल्पिक तर्क हैं।

अजगर में मैं कुछ ऐसा करूंगा:

def functionName(arg1,arg2=false,arg3=false):
    if arg2:
        #Do stuff with arguments
    else:
        #Do stuff without arguments

मैंने करने की कोशिश की है function FunctionName(arg1,arg2=false,arg3=false), लेकिन यह सिर्फ मुझे एक तर्क अमान्य तर्क देता है।

मैं यह कैसे कर सकता हूँ vimscript में?

जवाबों:


34

हां, आप किसी फ़ंक्शन में वैकल्पिक तर्क ले सकते हैं। यह अजगर के काम करने के तरीके जितना सुविधाजनक नहीं है, लेकिन यह है कि आप इसे कैसे करते हैं:

function FooBar(...) " This is like *args in python
    echom a:0 " a:0 contains an integer which is the number of arguments passed to the function
    echom a:1 " a:1 contains the first argument passed, a:2 contains the second and so on
    echo a:000 " a:000 contains a list of all arguments that were passed to the function
endfunction

ध्यान दें कि आपके पास इस शैली में केवल 20 तर्क हो सकते हैं।

प्रासंगिक सहायता विषय:

:help :function
:help function-argument

26

पार्टी में थोड़ी देर हो गई, लेकिन मैंने अपना पसंदीदा नहीं देखा:

function! FunctionName(arg1,...)
    let arg2 = get(a:, 1, 0)
    let arg3 = get(a:, 2, 0)

    if arg2
        "Do stuff with arguments"
    else
        "Do stuff without arguments"
    endif
endfunction

जिसमें get(a:, n, default)मिल जाएगा nthलौटने वैकल्पिक तर्क defaultअगर यह मौजूद नहीं है।


ऊह यह अच्छा है!
1

3
मुझे पता है कि यह सुपर पुराना है, लेकिन इसे पढ़ने वाले किसी भी व्यक्ति को सिर्फ FYI करें। आप let a:arg=अब और नहीं कर सकते । आप की तरह कुछ का उपयोग करना चाहिए let l:arg=या बस let arg=। देखें github.com/vim/vim/commit/...
jmzagorski

23

यह पैटर्न आपको प्रत्येक तर्क के लिए सार्थक नाम प्रदान करेगा, और प्रदान नहीं किए गए किसी भी तर्क के लिए एक डिफ़ॉल्ट मान प्रदान करेगा:

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


a:0निर्धारित नाम मापदंडों को शामिल नहीं करता है। (वीआईएम 8.0 के साथ परीक्षण किया गया) के a:1भीतर पहला पैरामीटर है...
बोरिस ब्रोडस्की

धन्यवाद @BorisBrodski आप सही हैं, अच्छी पकड़ है। मैंने जवाब सही दिया है।
joeytwiddle

8

मैं विम्स्क्रिप्ट में अच्छी तरह से वाकिफ नहीं हूं, लेकिन यह है कि मैं इसे कैसे करूंगा:

function Func(foo, ...)
  if a:0 < 1
    let bar = "Unspecified bar"
  else
    let bar = a:1
  endif
  if a:0 < 2
    let baz = "Unspecified baz"
  else
    let baz = a:2
  endif

  echo a:foo
  echo bar
  echo baz
endfunction

आप तब call Func("Hello", "World"), और देख सकते हैं कि यह "हैलो", "वर्ल्ड", "अनिर्दिष्ट बाज" प्रिंट करता है।

यह vim फ़ंक्शंस के varargs फीचर का उपयोग कर रहा है, जो आपको फ़ंक्शन के लिए एक अतिरिक्त संख्या में मनमानी करने देता है। तर्कों को चर में संग्रहीत किया जाता है, जो a:0(अतिरिक्त तर्कों की सूची की लंबाई) पर निर्भर करता है , या तो उनके संगत तर्क या डिफ़ॉल्ट मान पर सेट हो जाते हैं।


2

चूंकि Vim 8.1.1310 Vim वास्तविक वैकल्पिक फ़ंक्शन तर्क का भी समर्थन करता है।

हालाँकि, इसका मतलब है कि अधिकांश विम स्थापना अभी तक इसका समर्थन नहीं करती है। इसके अलावा, neovim भी उस सुविधा की पेशकश नहीं करता है।

से उदाहरण :help optional-function-argument:

  function Something(key, value = 10)
     echo a:key .. ": " .. a:value
  endfunction
  call Something('empty')   "empty: 10"
  call Something('key', 20) "key: 20"   

साफ। आपको एक उदाहरण देने के लिए अपने उत्तर का विस्तार करना चाहिए ताकि हम जो कहते हैं उसे जल्दी से समझ सकें।
ल्यूक हरमिट 11

@LucHermitte मैंने तदनुसार अपना उत्तर संशोधित किया।
रेडलान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.