คำว่า "ผล" ในภาษา Ruby หมายถึงอะไร? และมันทำอะไรกันแน่?
ก็…
Yield คือคีย์เวิร์ด (หมายถึงเป็นส่วนหลักของภาษา) และใช้ในวิธีการเรียกบล็อก
นี่คือสิ่งที่คุณต้องรู้ :
- การเรียกบล็อกจะเรียกใช้โค้ดภายในบล็อกนั้น (เช่น การเรียกใช้เมธอด)
- ผลตอบแทนสามารถส่งผ่านอาร์กิวเมนต์จำนวนเท่าใดก็ได้ไปยังบล็อก
- ค่าส่งคืนของบล็อกกลายเป็นค่าส่งคืนสำหรับ
yield
คุณต้องเข้าใจบล็อคจึงจะสมเหตุสมผล
คุณสามารถคิดว่าบล็อกเป็นวิธีที่ไม่มีชื่อที่สามารถส่งผ่านเป็นอาร์กิวเมนต์พิเศษไปยังวิธีอื่นได้
นี่คือตัวอย่าง :
def make_salad yield "lettuce" yield "carrots" yield "olive oil" end make_salad { |ingredient| puts "Adding #{ingredient} to salad!" }
สิ่งนี้เรียกบล็อก 3 ครั้ง ทำให้เกิดผลลัพธ์นี้ :
Adding lettuce to salad! Adding carrots to salad! Adding olive oil to salad!
นั่นคือสาระสำคัญที่ yield
ก็เหมือนการเรียกเมธอด แต่เป็นการเรียกบล็อคแทน
เราไม่มีชื่อบล็อก ดังนั้นคีย์เวิร์ดนี้จะดูแลเรื่องนั้น
ตอนนี้ :
มาสำรวจกันว่าจะเกิดอะไรขึ้นหากคุณไม่มีบล็อคให้โทร
ผลตอบแทนโดยไม่มีการบล็อก ==ข้อความแสดงข้อผิดพลาด
หากคุณเรียก yield
โดยไม่มีการบล็อก คุณจะได้รับข้อผิดพลาด
ตัวอย่าง :
def write_code yield end write_code # LocalJumpError: no block given (yield)
ข้อผิดพลาดนี้ชัดเจน “ไม่มีการบล็อก” หมายความว่าเมธอดเรียก write_code
ไม่ได้ให้บริการบล็อก
คุณจะป้องกันข้อผิดพลาดนี้ได้อย่างไร
ชอบสิ่งนี้:
def write_code yield if block_given? end
block_given?
เมธอดตรวจสอบว่ามีบล็อกหรือไม่ &อนุญาตให้คุณ yield
. เท่านั้น ถ้านั่นเป็นเรื่องจริง
เหตุใดจึงต้องใช้ผลตอบแทน
การใช้ yield
เปิดใช้งานการบล็อก
เราใช้บล็อกเพื่อส่งรหัสบางส่วนเป็นส่วนหนึ่งของการเรียกใช้เมธอด
มีประโยชน์เมื่อ :
- คุณต้องการเขียนฟังก์ชันการบันทึกทั่วไป ซึ่งจะบันทึกระยะเวลาที่โค้ดใช้ในการทำงาน
- คุณต้องการเรียกใช้โค้ดเมื่อวิธีการเสร็จสิ้น (เช่น “การเรียกกลับ” ใน Javascript)
- คุณต้องการ “Lazy code” รหัสที่ทำงานเมื่อจำเป็นเท่านั้น &ที่ผู้ใช้สามารถปรับแต่งได้ (สำหรับตัวอย่างนี้ โปรดอ่านเกี่ยวกับ
Hash#fetch
วิธีการ)
เยี่ยมเลย!
Yield_Self – อะไรคือความแตกต่าง
คุณอาจพบ yield_self
. ใหม่นี้ method &คิดว่าเกี่ยวข้องกับ yield
.
ก็ไม่ใช่
แม้แต่ yield(self)
ต่างกันเพราะตนเองหมายถึงวัตถุปัจจุบัน
โดยที่ yield_self
ซึ่งถูกเพิ่มใน Ruby 2.5 หมายถึงอ็อบเจ็กต์ที่เราเรียกใช้เมธอด
ใช้วิธีนี้ดีไหม
ใช้เมื่อใดก็ตามที่คุณต้องการโยงเมธอดและทำบางสิ่งกับออบเจกต์ที่คุณกำลังเรียก yield_self
บน.
ขณะส่งคืนผลลัพธ์แทนวัตถุเดิม
ตัวอย่าง :
n_squared = ->(n) { n ** 2 } 2 .yield_self(&n_squared) .yield_self(&n_squared) # 16
ใน Ruby 2.6 มีนามแฝงสำหรับ yield_self
, then
วิธีการ
แต่อย่าสับสนกับ yield
. ปกติของคุณ .
โอเคไหม
ผลผลิตในราง
ฉันควรพูดถึงการใช้ yield
. อย่างรวดเร็ว ใน Rails &templating engine
คุณจะพบ yield
ภายในเลย์เอาต์
Rails แทนที่ด้วยเนื้อหาของมุมมองที่คุณกำลังแสดงผล
ไม่มี yield
เท่ากับเลย์เอาต์เปล่า!
นั่นคือวิธีการรวมเลย์เอาต์และมุมมองของคุณเข้าด้วยกัน
สรุป
คุณได้เรียนรู้เกี่ยวกับคีย์เวิร์ดผลตอบแทนใน Ruby แล้ว! มันคืออะไร มันทำงานอย่างไร และเหตุใดจึงสำคัญ
ลองใช้รหัส Ruby ของคุณเลย
ขอบคุณที่อ่าน! 🙂