บล็อกเป็นส่วนสำคัญของ Ruby ยากที่จะจินตนาการถึงภาษาที่ไม่มีพวกมัน แต่แลมบ์ดาส? ใครรักแลมบ์ดา? คุณสามารถไปหลายปีโดยไม่ต้องใช้ เกือบจะดูเหมือนของที่ระลึกจากยุคอดีต
...แต่นั่นไม่เป็นความจริงเลย แลมบ์ดาสมีกลอุบายที่น่าสนใจบางอย่างติดตัวเมื่อคุณสำรวจพวกเขาสักหน่อย
ในบทความนี้ เราจะเริ่มต้นด้วยพื้นฐานของการใช้แลมบ์ดา และจากนั้นไปยังการใช้งานขั้นสูงที่น่าสนใจยิ่งขึ้น ดังนั้นหากคุณใช้แลมบ์ดาทุกวันและรู้ข้อมูลทั้งหมดเกี่ยวกับมัน เพียงเลื่อนลงมา
สิ่งสำคัญที่ต้องจำเกี่ยวกับแลมบ์ดาสคือพวกมันทำหน้าที่เหมือนทำหน้าที่ Blocks และ Procs มีประโยชน์ แต่ทั้งสองไม่มีพฤติกรรมเหมือนฟังก์ชันในชีวิตจริง 100% แลมบ์ดาสก็ได้ ลงรายการกันเลยค่ะ
Lambdas บังคับใช้จำนวนอาร์กิวเมนต์ที่ถูกต้อง
แลมบ์ดาสบังคับใช้จำนวนอาร์กิวเมนต์ที่ถูกต้องไม่เหมือน Procs
Lambdas รองรับอาร์กิวเมนต์เริ่มต้น
ในตัวอย่างด้านล่าง เราสร้างฟังก์ชันแลมบ์ดาด้วยค่าอาร์กิวเมนต์เริ่มต้นเป็น "hello world"
Lambdas รองรับอาร์กิวเมนต์เริ่มต้น
The return
คำหลักทำงานตรงตามที่คุณคาดหวัง
บางทีนี่อาจฟังดูเล็กน้อย แต่ถ้าคุณเคยลองใช้ return ภายใน proc คุณก็รู้ดีว่าไม่เป็นเช่นนั้น
ตัวอย่างด้านล่างจะแสดงให้คุณเห็นว่าฉันหมายถึงอะไร ฉันได้กำหนดวิธีการที่เรียกว่า something
ที่เรียก Proc
. Proc
มีใบแจ้งกลับ แต่คำสั่งส่งคืนนั้นยุ่งยาก แทนที่จะกลับมาจาก proc มันกลับจากวิธีบางอย่าง
แต่เมื่อฉันทำสิ่งที่คล้ายกับ lambda
, return
คำสั่งเพิ่งกลับมาจากแลมบ์ดา เหมือนกับฟังก์ชันอื่นๆ
เมื่อคุณใช้คีย์เวิร์ดส่งคืนภายในแลมบ์ดา คีย์เวิร์ดจะส่งคืนจากแลมบ์ดา
Lambdas ถูกปิด
วิธีอ้างอิงโพสต์ล้นกองที่ยอดเยี่ยม:
วิธีคิดการปิดที่ง่ายที่สุดคือ **ฟังก์ชันที่สามารถจัดเก็บเป็นตัวแปร** (เรียกว่า "ฟังก์ชันระดับเฟิร์สคลาส") ซึ่งมีความสามารถพิเศษในการเข้าถึงตัวแปรอื่นๆ ขอบเขตที่สร้างขึ้น
การเข้าถึงตัวแปรอื่นๆ ภายในขอบเขตที่แลมบ์ดาสร้างขึ้นหมายความว่าอย่างไร ลองมาดูกัน ในตัวอย่างด้านล่าง ฉันได้สร้างตัวแปรท้องถิ่นชื่อ marco
. ฉันสามารถใช้ตัวแปรนั้นในแลมบ์ดาของฉันได้ และถ้าฉันเปลี่ยนค่าในตัวแปรนั้นแลมบ์ดาจะเห็นค่าใหม่
รูบี้ lambdas ถูกปิด
แลมบ์ดาคือกิ้งก่า
สิ่งที่แปลกประหลาดอย่างหนึ่งเกี่ยวกับแลมบ์ดาสคือความหลากหลายของวิธีที่เราสามารถเรียกมันได้ ตัวอย่างด้านล่างแสดงสามวิธีในการเรียกใช้แลมบ์ดา เท่ากันหมด
มีอย่างน้อยสามวิธีในการเรียกใช้ lambda ใน Ruby
บางทีนี่อาจดูแปลกสำหรับคุณ มันทำกับฉันในตอนแรก และบอกตามตรงว่า l.(arg)
ไวยากรณ์ยังคงทำให้ฉันงุนงง แต่ l[arg]
ไวยากรณ์ค่อนข้างน่าสนใจ หมายความว่าคุณสามารถใช้แลมบ์ดาในสถานที่ที่ปกติคุณใช้อาร์เรย์หรือแฮชได้ในระดับที่จำกัด
การใช้ lambdas เป็นแฮชและอาร์เรย์ที่คำนวณได้
ลองนึกภาพว่าคุณมีชุดทดสอบ ในการเริ่มต้น คุณจะต้องสร้างเรกคอร์ดบุคคลปลอม มันง่าย คุณเพียงแค่สร้างบันทึก FakePerson ใหม่และส่งต่อในชื่อและนามสกุล
แต่ถ้าคุณต้องการ "ทดสอบคลุมเครือ" โดยใช้ชื่อและนามสกุลต่างกันทุกครั้งที่ทำการทดสอบ
วิธีหนึ่งในการทำเช่นนี้อาจเป็นการส่งฟังก์ชันแลมบ์ดา แทนการแฮช . ในตัวอย่างนี้ ฉันใช้ฟังก์ชันแลมบ์ดาเพื่อสร้างชื่อปลอมผ่าน Faker gem ที่ยอดเยี่ยม
ที่นี่แลมบ์ดาแสร้งทำเป็นแฮช
แลมบ์ดามีเครื่องแกงในตัว
Currying เป็นเทคนิคที่ยอดเยี่ยมที่ใช้บ่อยในการเขียนโปรแกรมเชิงฟังก์ชัน เป็นวิธีที่จะช่วยให้คุณสร้างฟังก์ชันใหม่จากฟังก์ชันที่มีอยู่ได้ เข้าใจง่ายเมื่อเห็นในทางปฏิบัติ
ในโค้ดด้านล่าง ฉันมีฟังก์ชันแลมบ์ดาที่บวกตัวเลขสองตัว สะดวกเรียกว่าเพิ่ม จากนั้นฉันก็ใช้ currying เพื่อสร้างฟังก์ชันพิเศษที่เรียกว่า increment เพียงบวกหนึ่งเข้ากับตัวเลขใดๆ
คุณสามารถจัดการ proc อะไรก็ได้ใน Ruby
Lambdas เป็น Proc ชนิดพิเศษ
คุณอาจสังเกตเห็นว่าในตัวอย่างโค้ดทั้งหมด เมื่อใดก็ตามที่ฉันกำหนดฟังก์ชันแลมบ์ดา ฉันจะได้รับ Proc เป็นการตอบแทน นั่นเป็นเพราะ Ruby ใช้ lambdas เป็น Proc หลายๆ อย่างที่ฉันได้แสดงให้คุณเห็นในบทความนี้สามารถทำได้ด้วย Procs และ lambdas
สตาบบี้ แลมบ์ดาส
ในบทความนี้ ฉันได้ใช้คำหลักแลมบ์ดาเพื่อความชัดเจน แต่มีไวยากรณ์ที่กระชับกว่าสำหรับการกำหนด lambdas ที่นำมาใช้ใน Ruby 1.9 และรู้จักกันในชื่อ "stabby lambda" วิธีการทำงาน:
ไวยากรณ์แลมบ์ดา Staby ของ Ruby ถูกนำมาใช้ในเวอร์ชัน 1.9