การเข้าใจว่าเมื่อไหร่ควรใช้ lambda
กับ Proc.new
ใน Ruby
เมื่อเขียนโปรแกรมใน Ruby โดยเฉพาะก่อนเวอร์ชัน 1.9 นักพัฒนาหลายคนต้องเผชิญกับปัญหาทั่วไป: เมื่อไหร่ที่ฉันควรใช้ lambda
และเมื่อไหร่ที่ฉันควรใช้ Proc.new
? แม้ว่าทั้งสองจะดูคล้ายกัน แต่ทั้งสองโครงสร้างมีความแตกต่างที่สำคัญซึ่งสามารถส่งผลต่อพฤติกรรมของโค้ดของคุณ และการเข้าใจความแตกต่างเหล่านี้เป็นสิ่งสำคัญสำหรับนักพัฒนา Ruby ทุกคน
ความแตกต่างที่สำคัญระหว่าง lambda
และ Proc.new
1. พฤติกรรมของคำสั่ง Return
หนึ่งในความแตกต่างที่สำคัญที่สุดอยู่ที่วิธีที่แต่ละโครงสร้างจัดการกับคำสั่ง return
มาทำความเข้าใจกัน:
-
Return ใน proc ที่ถูกสร้างจาก
lambda
:- เมื่อคุณเรียก
return
จากภายในlambda
มันจะจบการทำงานจากlambda
เท่านั้น หลังจากการคืนค่าจากlambda
การควบคุมจะกลับไปยังเมธอดที่เรียก และการดำเนินการจะดำเนินต่อไปตามปกติ
- เมื่อคุณเรียก
-
Return ใน proc ที่ถูกสร้างจาก
Proc.new
:- ในทางตรงกันข้าม การเรียก
return
จากProc.new
จะไม่เพียงแต่จะสิ้นสุดการทำงานของ proc แต่ยังสิ้นสุดการทำงานของเมธอดที่อยู่ภายในด้วย ซึ่งอาจนำไปสู่พฤติกรรมที่ไม่คาดคิดในโค้ดของคุณ
- ในทางตรงกันข้าม การเรียก
นี่คือตัวอย่างสั้นๆ:
ตัวอย่างการใช้งาน
ตัวอย่างของ lambda
def whowouldwin
mylambda = lambda { return "Freddy" }
mylambda.call
return "Jason" # บรรทัดนี้จะถูกดำเนินการ
end
puts whowouldwin # ผลลัพธ์: "Jason"
ในตัวอย่างข้างต้น lambda
ที่ทำงานจะคืนค่า “Freddy” แต่การควบคุมจะกลับไปยังเมธอดและดำเนินการบรรทัดถัดไป คืนค่า “Jason” แทน
ตัวอย่างของ Proc.new
def whowouldwin2
myproc = Proc.new { return "Freddy" }
myproc.call
return "Jason" # บรรทัดนี้จะไม่ถูกดำเนินการ
end
puts whowouldwin2 # ผลลัพธ์: "Freddy"
ในกรณีนี้ เมื่อ Proc.new
รันคำสั่งคืนค่า การควบคุมจะส่งกลับจากเมธอดทั้งหมด ดังนั้น “Jason” จะไม่ถูกคืนค่า
2. ความยืดหยุ่นและการใช้งาน
-
ใช้
lambda
เมื่อ:- คุณต้องการพฤติกรรมที่คาดเดาได้กับคำสั่ง
return
- คุณคาดหวังว่าค่าที่คืนค่าจะถูกส่งกลับเฉพาะจาก proc นั้นและดำเนินการต่อในเมธอดที่อยู่ภายใน
- คุณต้องการพฤติกรรมที่คาดเดาได้กับคำสั่ง
-
ใช้
Proc.new
เมื่อ:- คุณต้องการพฤติกรรมที่ยืดหยุ่นมากขึ้น (และบางครั้งอาจมีความเสี่ยง) กับคำสั่งคืนค่า และต้องการให้ proc สิ้นสุดทั้ง proc และเมธอด
- คุณต้องการพิมพ์น้อยลงและไวยากรณ์ที่เรียบง่ายในบางบริบท
สรุป
การเลือกใช้ระหว่าง lambda
และ Proc.new
ใน Ruby อาจส่งผลต่อการไหลและผลลัพธ์ของโค้ดของคุณอย่างมาก สำหรับกรณีส่วนใหญ่ โดยเฉพาะในกรณีที่ความชัดเจนและความคาดเดาได้เป็นสิ่งสำคัญ โดยทั่วไปแนะนำให้ใช้ lambda
มากกว่า Proc.new
อย่างไรก็ตาม การเข้าใจบริบทที่แต่ละตัวใช้ได้จะช่วยให้การเขียนโปรแกรมของคุณมีประสิทธิภาพและสนุกสนานยิ่งขึ้น
โดยการรักษาความแตกต่างเหล่านี้ในใจและใช้ในโค้ดของคุณอย่างรอบคอบ คุณสามารถหลีกเลี่ยงกับดักทั่วไปและเขียนโปรแกรม Ruby ที่มีความแข็งแกร่งมากขึ้น