ฉันอาจจะผิดเพราะไม่มีใครพูดถึงมัน แต่ฉันก็รู้สึกว่าเหตุผลสำหรับเรื่องนี้ก็คือมรดกทับทิมที่สามารถเรียกฟังก์ชั่นได้โดยไม่ต้องใส่วงเล็บ
เห็นได้ชัดว่า Arity มีส่วนเกี่ยวข้อง แต่ให้วางไว้ครู่หนึ่งและใช้ฟังก์ชั่นโดยไม่มีข้อโต้แย้ง ในภาษาอย่าง javascript ที่จำเป็นต้องใส่วงเล็บมันเป็นเรื่องง่ายที่จะสร้างความแตกต่างระหว่างการส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์และการเรียกใช้ฟังก์ชัน คุณเรียกมันว่าเฉพาะเมื่อคุณใช้วงเล็บ
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
อย่างที่คุณเห็นการตั้งชื่อหรือไม่สร้างความแตกต่างใหญ่ แต่น้ำอมฤตและทับทิมช่วยให้คุณสามารถเรียกใช้ฟังก์ชั่นที่ไม่มีวงเล็บ นี่คือตัวเลือกการออกแบบที่ฉันชอบ แต่มันมีผลข้างเคียงนี้คุณไม่สามารถใช้ชื่อที่ไม่มีวงเล็บเพราะมันอาจหมายความว่าคุณต้องการเรียกใช้ฟังก์ชัน นี่คือสิ่งที่&
มีไว้สำหรับ หากคุณปล่อยให้ arity appart เป็นเวลาที่สองให้เตรียมชื่อฟังก์ชันของคุณด้วย&
หมายความว่าคุณต้องการใช้ฟังก์ชันนี้เป็นอาร์กิวเมนต์อย่างชัดเจนไม่ใช่ว่าฟังก์ชันนี้จะส่งกลับอย่างไร
ตอนนี้ฟังก์ชั่นที่ไม่ระบุชื่อจะแตกต่างกันเล็กน้อยในการที่มันถูกใช้เป็นอาร์กิวเมนต์ อีกครั้งนี่คือตัวเลือกการออกแบบ แต่เหตุผลที่อยู่เบื้องหลังมันคือส่วนใหญ่จะใช้โดย iterators ชนิดของฟังก์ชันที่ใช้หน้าที่เป็นอาร์กิวเมนต์ เห็นได้ชัดว่าคุณไม่จำเป็นต้องใช้&
เพราะพวกเขาถือว่าเป็นข้อโต้แย้งโดยค่าเริ่มต้น มันคือจุดประสงค์ของพวกเขา
ตอนนี้ปัญหาสุดท้ายคือบางครั้งคุณต้องโทรหาพวกเขาในรหัสของคุณเพราะพวกเขาไม่ได้ใช้กับฟังก์ชั่นตัววนซ้ำเสมอไปหรือคุณอาจเข้ารหัสตัววนซ้ำด้วยตัวคุณเอง สำหรับเรื่องราวเล็ก ๆ น้อย ๆ เนื่องจากทับทิมเป็นวัตถุเชิงวิธีหลักในการทำมันคือการใช้call
วิธีการกับวัตถุ ด้วยวิธีนี้คุณสามารถทำให้พฤติกรรมของวงเล็บไม่สอดคล้องกันได้
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
ตอนนี้มีใครบางคนขึ้นมาด้วยทางลัดซึ่งโดยทั่วไปดูเหมือนว่าวิธีการที่ไม่มีชื่อ
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
นี่เป็นตัวเลือกการออกแบบ ตอนนี้น้ำอมฤตไม่ได้เป็นวัตถุและดังนั้นจึงเรียกไม่ได้ใช้รูปแบบแรกอย่างแน่นอน ฉันไม่สามารถพูดแทนโฮเซ่ได้ แต่ดูเหมือนว่ารูปแบบที่สองถูกใช้ในยาอายุวัฒนะเพราะมันยังคงดูเหมือนว่าการเรียกใช้ฟังก์ชันที่มีอักขระพิเศษ มันใกล้พอที่จะเรียกฟังก์ชั่น
ฉันไม่ได้คิดถึงข้อดีและข้อเสียทั้งหมด แต่ดูเหมือนว่าในทั้งสองภาษาคุณสามารถหนีไปได้ด้วยวงเล็บตราบใดที่คุณทำให้วงเล็บบังคับสำหรับฟังก์ชันที่ไม่ระบุชื่อ ดูเหมือนว่าจะเป็น:
วงเล็บบังคับ VS สัญกรณ์ที่แตกต่างกันเล็กน้อย
ในทั้งสองกรณีคุณทำการยกเว้นเนื่องจากคุณทำให้ทั้งคู่ทำงานแตกต่างกัน เนื่องจากมีความแตกต่างคุณอาจทำให้ชัดเจนและไปเพื่อสัญกรณ์ที่แตกต่างกัน วงเล็บที่บังคับจะดูเป็นธรรมชาติในกรณีส่วนใหญ่ แต่สับสนมากเมื่อสิ่งต่าง ๆ ไม่เป็นไปตามแผนที่วางไว้
ไปเลย ตอนนี้สิ่งนี้อาจไม่ใช่คำอธิบายที่ดีที่สุดในโลกเพราะฉันทำให้รายละเอียดส่วนใหญ่ง่ายขึ้น ส่วนใหญ่เป็นตัวเลือกการออกแบบและฉันพยายามให้เหตุผลกับพวกเขาโดยไม่ตัดสินพวกเขา ฉันรักยาอายุวัฒนะฉันรักทับทิมฉันชอบฟังก์ชั่นการโทรโดยไม่ต้องใส่วงเล็บ แต่ชอบคุณฉันพบว่าผลที่ตามมาค่อนข้างเข้าใจผิดเป็นครั้งคราว
และในน้ำอมฤตก็แค่จุดพิเศษนี้เท่านั้นในทับทิมคุณมีบล็อกอยู่ด้านบน บล็อกเป็นเรื่องที่น่าอัศจรรย์ใจและฉันรู้สึกประหลาดใจที่คุณสามารถทำอะไรกับบล็อกได้มากแค่ไหน แต่มันก็ใช้ได้เมื่อคุณต้องการฟังก์ชั่นนิรนามเพียงตัวเดียวซึ่งเป็นอาร์กิวเมนต์สุดท้าย จากนั้นเนื่องจากคุณควรจะสามารถจัดการกับสถานการณ์อื่น ๆ ต่อไปนี้เป็นวิธีการทั้งหมด / lambda / proc / block สับสน
อย่างไรก็ตาม ... มันอยู่นอกขอบเขต