Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การใช้ Lambdas ใน Ruby

บล็อกเป็นส่วนสำคัญของ Ruby ยากที่จะจินตนาการถึงภาษาที่ไม่มีพวกมัน แต่แลมบ์ดาส? ใครรักแลมบ์ดา? คุณสามารถไปหลายปีโดยไม่ต้องใช้ เกือบจะดูเหมือนของที่ระลึกจากยุคอดีต

...แต่นั่นไม่เป็นความจริงเลย แลมบ์ดาสมีกลอุบายที่น่าสนใจบางอย่างติดตัวเมื่อคุณสำรวจพวกเขาสักหน่อย

ในบทความนี้ เราจะเริ่มต้นด้วยพื้นฐานของการใช้แลมบ์ดา และจากนั้นไปยังการใช้งานขั้นสูงที่น่าสนใจยิ่งขึ้น ดังนั้นหากคุณใช้แลมบ์ดาทุกวันและรู้ข้อมูลทั้งหมดเกี่ยวกับมัน เพียงเลื่อนลงมา

สิ่งสำคัญที่ต้องจำเกี่ยวกับแลมบ์ดาสคือพวกมันทำหน้าที่เหมือนทำหน้าที่ Blocks และ Procs มีประโยชน์ แต่ทั้งสองไม่มีพฤติกรรมเหมือนฟังก์ชันในชีวิตจริง 100% แลมบ์ดาสก็ได้ ลงรายการกันเลยค่ะ

Lambdas บังคับใช้จำนวนอาร์กิวเมนต์ที่ถูกต้อง

การใช้ Lambdas ใน Ruby แลมบ์ดาสบังคับใช้จำนวนอาร์กิวเมนต์ที่ถูกต้องไม่เหมือน Procs

Lambdas รองรับอาร์กิวเมนต์เริ่มต้น

ในตัวอย่างด้านล่าง เราสร้างฟังก์ชันแลมบ์ดาด้วยค่าอาร์กิวเมนต์เริ่มต้นเป็น "hello world"

การใช้ Lambdas ใน Ruby Lambdas รองรับอาร์กิวเมนต์เริ่มต้น

The return คำหลักทำงานตรงตามที่คุณคาดหวัง

บางทีนี่อาจฟังดูเล็กน้อย แต่ถ้าคุณเคยลองใช้ return ภายใน proc คุณก็รู้ดีว่าไม่เป็นเช่นนั้น

ตัวอย่างด้านล่างจะแสดงให้คุณเห็นว่าฉันหมายถึงอะไร ฉันได้กำหนดวิธีการที่เรียกว่า something ที่เรียก Proc . Proc มีใบแจ้งกลับ แต่คำสั่งส่งคืนนั้นยุ่งยาก แทนที่จะกลับมาจาก proc มันกลับจากวิธีบางอย่าง

แต่เมื่อฉันทำสิ่งที่คล้ายกับ lambda , return คำสั่งเพิ่งกลับมาจากแลมบ์ดา เหมือนกับฟังก์ชันอื่นๆ

การใช้ Lambdas ใน Ruby เมื่อคุณใช้คีย์เวิร์ดส่งคืนภายในแลมบ์ดา คีย์เวิร์ดจะส่งคืนจากแลมบ์ดา

Lambdas ถูกปิด

วิธีอ้างอิงโพสต์ล้นกองที่ยอดเยี่ยม:

วิธีคิดการปิดที่ง่ายที่สุดคือ **ฟังก์ชันที่สามารถจัดเก็บเป็นตัวแปร** (เรียกว่า "ฟังก์ชันระดับเฟิร์สคลาส") ซึ่งมีความสามารถพิเศษในการเข้าถึงตัวแปรอื่นๆ ขอบเขตที่สร้างขึ้น

การเข้าถึงตัวแปรอื่นๆ ภายในขอบเขตที่แลมบ์ดาสร้างขึ้นหมายความว่าอย่างไร ลองมาดูกัน ในตัวอย่างด้านล่าง ฉันได้สร้างตัวแปรท้องถิ่นชื่อ marco . ฉันสามารถใช้ตัวแปรนั้นในแลมบ์ดาของฉันได้ และถ้าฉันเปลี่ยนค่าในตัวแปรนั้นแลมบ์ดาจะเห็นค่าใหม่

การใช้ Lambdas ใน Ruby รูบี้ lambdas ถูกปิด

แลมบ์ดาคือกิ้งก่า

สิ่งที่แปลกประหลาดอย่างหนึ่งเกี่ยวกับแลมบ์ดาสคือความหลากหลายของวิธีที่เราสามารถเรียกมันได้ ตัวอย่างด้านล่างแสดงสามวิธีในการเรียกใช้แลมบ์ดา เท่ากันหมด

การใช้ Lambdas ใน Ruby มีอย่างน้อยสามวิธีในการเรียกใช้ lambda ใน Ruby

บางทีนี่อาจดูแปลกสำหรับคุณ มันทำกับฉันในตอนแรก และบอกตามตรงว่า l.(arg) ไวยากรณ์ยังคงทำให้ฉันงุนงง แต่ l[arg] ไวยากรณ์ค่อนข้างน่าสนใจ หมายความว่าคุณสามารถใช้แลมบ์ดาในสถานที่ที่ปกติคุณใช้อาร์เรย์หรือแฮชได้ในระดับที่จำกัด

การใช้ lambdas เป็นแฮชและอาร์เรย์ที่คำนวณได้

ลองนึกภาพว่าคุณมีชุดทดสอบ ในการเริ่มต้น คุณจะต้องสร้างเรกคอร์ดบุคคลปลอม มันง่าย คุณเพียงแค่สร้างบันทึก FakePerson ใหม่และส่งต่อในชื่อและนามสกุล

แต่ถ้าคุณต้องการ "ทดสอบคลุมเครือ" โดยใช้ชื่อและนามสกุลต่างกันทุกครั้งที่ทำการทดสอบ

วิธีหนึ่งในการทำเช่นนี้อาจเป็นการส่งฟังก์ชันแลมบ์ดา แทนการแฮช . ในตัวอย่างนี้ ฉันใช้ฟังก์ชันแลมบ์ดาเพื่อสร้างชื่อปลอมผ่าน Faker gem ที่ยอดเยี่ยม

การใช้ Lambdas ใน Ruby ที่นี่แลมบ์ดาแสร้งทำเป็นแฮช

แลมบ์ดามีเครื่องแกงในตัว

Currying เป็นเทคนิคที่ยอดเยี่ยมที่ใช้บ่อยในการเขียนโปรแกรมเชิงฟังก์ชัน เป็นวิธีที่จะช่วยให้คุณสร้างฟังก์ชันใหม่จากฟังก์ชันที่มีอยู่ได้ เข้าใจง่ายเมื่อเห็นในทางปฏิบัติ

ในโค้ดด้านล่าง ฉันมีฟังก์ชันแลมบ์ดาที่บวกตัวเลขสองตัว สะดวกเรียกว่าเพิ่ม จากนั้นฉันก็ใช้ currying เพื่อสร้างฟังก์ชันพิเศษที่เรียกว่า increment เพียงบวกหนึ่งเข้ากับตัวเลขใดๆ

การใช้ Lambdas ใน Ruby คุณสามารถจัดการ proc อะไรก็ได้ใน Ruby

Lambdas เป็น Proc ชนิดพิเศษ

คุณอาจสังเกตเห็นว่าในตัวอย่างโค้ดทั้งหมด เมื่อใดก็ตามที่ฉันกำหนดฟังก์ชันแลมบ์ดา ฉันจะได้รับ Proc เป็นการตอบแทน นั่นเป็นเพราะ Ruby ใช้ lambdas เป็น Proc หลายๆ อย่างที่ฉันได้แสดงให้คุณเห็นในบทความนี้สามารถทำได้ด้วย Procs และ lambdas

สตาบบี้ แลมบ์ดาส

ในบทความนี้ ฉันได้ใช้คำหลักแลมบ์ดาเพื่อความชัดเจน แต่มีไวยากรณ์ที่กระชับกว่าสำหรับการกำหนด lambdas ที่นำมาใช้ใน Ruby 1.9 และรู้จักกันในชื่อ "stabby lambda" วิธีการทำงาน:

การใช้ Lambdas ใน Ruby ไวยากรณ์แลมบ์ดา Staby ของ Ruby ถูกนำมาใช้ในเวอร์ชัน 1.9