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

ทำความเข้าใจ Yield &Yield_Self ใน Ruby (คู่มือฉบับสมบูรณ์)

คำว่า "ผล" ในภาษา 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 ของคุณเลย

ขอบคุณที่อ่าน! 🙂