Optionচ্ছিক যুক্তি দিয়ে কীভাবে একটি উইমস্ক্রিপ্ট ফাংশন করবেন?


35

আমি একটি ফাংশন করতে চাই যাতে alচ্ছিক আর্গুমেন্ট রয়েছে।

পাইথনে আমি এই জাতীয় কিছু করব:

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), তবে এটি আমাকে অবৈধ যুক্তি বলতে ত্রুটি দেয়।

আমি কীভাবে এটি উইমস্ক্রিপ্টে করব?

উত্তর:


35

হ্যাঁ, আপনি কোনও ফাংশনে alচ্ছিক যুক্তি নিতে পারেন। অজগরটি এটি করার পদ্ধতি হিসাবে সুবিধাজনক নয়, তবে আপনি এটি এটি করেন:

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

27

পার্টিতে কিছুটা দেরি করেও আমি আমার প্রিয়টি দেখতে পাইনি:

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যদি এটা বর্তমান নয়।


ওহ খুব সুন্দর!
জোয়েটউইডল

3
আমি জানি এটি অত্যন্ত পুরানো, তবে এটি পড়ার জন্য কেবল এফওয়াইআই। আপনি 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 উত্তীর্ণ alচ্ছিক আর্গুমেন্টগুলির সংখ্যা গণনা করে

a:1, a:2... ... আমাদের alচ্ছিক যুক্তি অ্যাক্সেস করা যাক

বাধ্যতামূলক যুক্তি (কেবল 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নির্দিষ্ট নামযুক্ত পরামিতিগুলি অন্তর্ভুক্ত করে না। a:1এর মধ্যে প্রথম প্যারামিটার ...(কেবলমাত্র ভিআইএম 8.0 এর সাথে পরীক্ষা করা হয়েছে)
বোরিস ব্রডস্কি

ধন্যবাদ @ বোরিসব্রডস্কি আপনি ঠিক বলেছেন, ভাল ক্যাচ আমি উত্তরটি সংশোধন করেছি।
জোয়েটউইল

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")দেখতে পারেন এবং এটি "হ্যালো", "ওয়ার্ল্ড", "অনির্দিষ্ট বাজ" মুদ্রণ করে।

এটি ভিআইএম ফাংশনগুলির ভ্যারারগস বৈশিষ্ট্যটি ব্যবহার করছে, যা আপনাকে ফাংশনে একটি স্বেচ্ছাসেবী অতিরিক্ত সংখ্যক যুক্তি দেয় pass আর্গুমেন্টগুলি ভেরিয়েবলগুলিতে সংরক্ষণ করা হয় যা a:0(অতিরিক্ত আর্গুমেন্ট তালিকার দৈর্ঘ্য) এর উপর নির্ভর করে হয় তাদের সম্পর্কিত আর্গুমেন্ট বা একটি ডিফল্ট মান সেট করে।


2

যেহেতু Vim 8.1.1310 Vim বাস্তব alচ্ছিক ফাংশন যুক্তি সমর্থন করে supports

তবে এর অর্থ এই যে বেশিরভাগ ভিআইএম ইনস্টলেশন এটি এখনও সমর্থন করে না। এছাড়াও নিওভিমও সেই বৈশিষ্ট্যটি সরবরাহ করে না।

থেকে উদাহরণ :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"   

ঝরঝরে। একটি উদাহরণ দেওয়ার জন্য আপনার উত্তরটি প্রসারিত করা উচিত যাতে এটি কী যুক্ত করে তা আমরা দ্রুত বুঝতে পারি।
লুক হার্মিটে

@ লুচর্মিট আমি সেই অনুযায়ী আমার উত্তরটি পরিবর্তন করেছি।
রডলান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.