“ Splats” หมายความว่าอย่างไรในบทแนะนำ CoffeeScript


114

ดูบทช่วยสอน CoffeeScript นี้: http://jashkenas.github.com/coffee-script/

ฉันไม่ค่อยเห็นว่า Splats มีไว้เพื่ออะไร สิ่งก่อสร้างนี้คืออะไร? มาจากไหน (ในอดีต)


และตามปกติคุณควรทราบด้วยว่าสามารถนำไปใช้ใน vanilla Js: arguments+ call: stackoverflow.com/questions/17380315/…
Ciro Santilli 郝海东冠状病六四事件法轮功

1
ฉันชอบคิดว่ามันเป็นพารามิเตอร์ที่ทำให้ "splatted" (เหมือนสี) เป็นความต่อเนื่องที่ไม่มีกำหนด
arviman

3
สำหรับทุกคนที่มีความโน้มเอียงงูใหญ่นี้เป็นของคุณใน*args def foo(*args):
maligree

1
หมายเหตุคำศัพท์: ES6 ใช้ไวยากรณ์ที่คล้ายกัน แต่มีคำนำหน้า ใน ES6 ที่ได้รับ, ...argsการตั้งชื่อพารามิเตอร์ส่วนที่เหลือและขยาย...argsเป็นตัวอักษรเรียกฟังก์ชัน / อาร์เรย์ / วัตถุเป็นชื่อการแพร่กระจาย
Beni Cherniavsky-ร์กพาสกิน

คำตอบ:


199

คำว่า "ตัวดำเนินการ splat" มาจาก Ruby โดยที่*อักขระ (บางครั้งเรียกว่า "splat" - ดูรายการ Jargon File ) เพื่อระบุว่ารายการในรายการอาร์กิวเมนต์ควร "เต็ม" รายการอาร์กิวเมนต์

CoffeeScript นำมาใช้เครื่องหมายทับทิมสไตล์มากในช่วงต้น (ดูปัญหา 16 ) แต่ในข้อเสนอแนะดักลาส Crockford ของไวยากรณ์ก็เปลี่ยนจาก*xไปx...สองสามสัปดาห์ต่อมา (ดูปัญหา 45 ) อย่างไรก็ตาม CoffeeScripters ยังคงอ้างถึงไวยากรณ์เป็นตัวดำเนินการ "splat" หรือ "splat"

สำหรับสิ่งที่พวกเขาทำจริงการแยกชิ้นส่วนของargumentsวัตถุในลักษณะที่อาร์กิวเมนต์ Splatted กลายเป็นอาร์เรย์ของอาร์กิวเมนต์ "พิเศษ" ทั้งหมด ตัวอย่างที่น่าสนใจที่สุดคือ

(args...) ->

ในกรณีนี้ก็จะเป็นสำเนาอาร์เรย์ของargs argumentsอาร์กิวเมนต์ Splatted สามารถมาก่อนหลังหรือระหว่างอาร์กิวเมนต์มาตรฐาน:

(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->

ในสองกรณีแรกหากฟังก์ชันได้รับอาร์กิวเมนต์ 0-1 restจะเป็นอาร์เรย์ว่าง ในกรณีสุดท้ายฟังก์ชันต้องได้รับมากกว่า 2 อาร์กิวเมนต์เพื่อrestให้ไม่ว่างเปล่า

เนื่องจาก JavaScript ไม่อนุญาตให้มีลายเซ็นหลายตัวสำหรับฟังก์ชันที่มีชื่อเดียวกัน (เช่นเดียวกับ C และ Java) จึงช่วยประหยัดเวลาได้มากสำหรับการจัดการกับอาร์กิวเมนต์ที่แตกต่างกัน


2
คล้ายกับparamsคีย์เวิร์ดC #
ThatMatthew

ฉันต้องใช้สิ่งนี้เมื่อใด
Jeff Scott Ward

1
เมื่อคุณไม่แน่ใจเกี่ยวกับจำนวนพารามิเตอร์ที่คุณต้องการยอมรับ
gprasant

1
เรียกในทางเทคนิคว่า [ฟังก์ชันตัวแปร] ( en.wikipedia.org/wiki/Variadic_function ) หรือฟังก์ชันของ "arity" ที่ไม่มีกำหนด ภาษาส่วนใหญ่ใช้รูปแบบจุดไข่ปลาของบางประเภทเพื่อระบุอาร์กิวเมนต์ของตัวแปร
Lawrence Dol

1
@JeffScottWard ตัวอย่างที่สมบูรณ์แบบคือ console.log ซึ่งยอมรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้ console.log('this:',variable,'should be replaced with', another_variable);
Rob

13

ถ้าคุณรู้จัก python โดยargs...ประมาณคล้ายกับ*argsมันช่วยให้คุณสามารถจัดการกับพารามิเตอร์ฟังก์ชันเป็นรายการได้

ตัวอย่างเช่น:

concat = (args...) -> args.join(', ')
concat('hello', 'world') == 'hello, world'
concat('ready', 'set', 'go!') == 'ready, set, go!'

มันใช้งานได้ใน assginments ด้วย:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]

6

Splats เป็นคำศัพท์สำหรับการใช้ตัว...ดำเนินการสำหรับ var-args (ฟังก์ชันที่รับอาร์กิวเมนต์จำนวนตัวแปร)


ดูเพิ่มเติม: * args และ ** kwargs ของ Python และพารามิเตอร์ที่เหลือของ ActionScript 3
Jordan

3

ฉันคิดว่ามันเป็นน้ำตาลเชิงไวยากรณ์สำหรับวัตถุอาร์กิวเมนต์ของจาวาสคริปต์

ความคิดที่อาจจะมารูปแบบของทับทิมประกอบเครื่องหมาย*


ในทางเทคนิคมันมากกว่าเล็กน้อยเนื่องจากสามารถใช้ด้านซ้ายมือในการมอบหมายงานและสามารถใช้ร่วมกับอาร์กิวเมนต์ที่มีชื่อ: in (x, rest...) ->, restwont contain x, argumentsdoes
keppla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.