รูปแบบนี้จะช่วยให้คุณกำหนดชื่อที่มีความหมายให้กับแต่ละอาร์กิวเมนต์และให้ค่าเริ่มต้นสำหรับอาร์กิวเมนต์ที่ไม่มีให้:
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 ชี้ให้เห็น:
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:
ขีด จำกัด ของการทำงานเพื่อขอบเขตสคริปต์ สิ่งนี้จะช่วยหลีกเลี่ยงการสร้างเนมสเปซส่วนกลาง (และเสี่ยงต่อการชน) หากฟังก์ชันของคุณถูกอ้างอิงจากที่อื่นภายในสคริปต์เท่านั้น โดยทั่วไปแล้วเป็นวิธีที่ต้องการในการกำหนดฟังก์ชั่นเมื่อไม่จำเป็นต้องมองเห็นได้ทั่วโลก ;-)