ฉันจะส่งคืนบางสิ่งก่อนจากบล็อกได้อย่างไร


92

หากฉันต้องการทำสิ่งนี้:

collection.each do |i|
   return nil if i == 3

   ..many lines of code here..
end

ฉันจะได้รับผลกระทบนั้นอย่างไร? ฉันรู้ว่าฉันสามารถห่อทุกอย่างในบล็อกด้วยคำสั่ง big if ได้ แต่ฉันต้องการหลีกเลี่ยงการซ้อนกันถ้าเป็นไปได้

ตัวแบ่งจะไม่ทำงานที่นี่เพราะฉันไม่ต้องการหยุดการทำซ้ำขององค์ประกอบที่เหลือ

คำตอบ:


179

nextภายในบล็อกจะกลับมาจากบล็อก breakภายในบล็อกจะส่งกลับจากฟังก์ชันที่ให้ผลกับบล็อก สำหรับeachวิธีนี้หมายความว่าbreakออกจากลูปและnextข้ามไปยังการวนซ้ำถัดไปของลูป (ตามชื่อ) คุณสามารถคืนค่าด้วยและnext valuebreak value


54
+1 สำหรับnext valueและbreak value. สิ่งที่ฉันกำลังมองหา
Joshua Pinter

1
break valueไม่ได้ผลสำหรับฉันในขณะที่next valueทำงานได้ดี ขอบคุณมาก.
Francesco Belladonna

4
ฉันไม่แน่ใจว่าคำจำกัดความของคุณต่อไปและแบ่งถูกต้อง อย่างน้อยที่สุดพวกเขาก็สับสน break ออกจากวงในสุดจากนั้นจะย้ายคุณไปยังการวนซ้ำถัดไป ที่มา: tutorialspoint.com/ruby/ruby_loops.htm
WattsInABox

3
@WattsInABox nextและbreakไม่เฉพาะเจาะจงกับโครงสร้างแบบวนซ้ำดังนั้นบทความที่คุณเชื่อมโยงจึงทำให้เข้าใจผิดได้มาก (เนื่องจากมีนัยอย่างมากในทางตรงกันข้าม) และคำอธิบายของฉันถูกต้องอย่างแน่นอนเมื่อnextและbreakถูกใช้ในบล็อก (โปรดทราบว่าwhileและforมักไม่ค่อยมีการใช้ใน Ruby ดังนั้น 99% ของการใช้งานnextและbreakอยู่ในบล็อก)
sepp2k

ฉันคิดว่าคุณหมายถึงบล็อกที่ไม่วนซ้ำ นั่นคือสิ่งที่สับสนเกี่ยวกับมัน นอกจากนี้ฉันไม่เห็นด้วยกับคำยืนยัน 99% ของคุณ แต่นั่นเป็นข้อโต้แย้งที่แตกต่างกัน
WattsInABox

11
#!/usr/bin/ruby

collection = [1, 2, 3, 4, 5 ]

stopped_at = collection.each do |i|
   break i if i == 3

   puts "Processed #{i}"
end

puts "Stopped at and did not process #{stopped_at}"

5

ในกรณีนี้คุณสามารถใช้ตัวแบ่งเพื่อยุติลูปก่อนกำหนด:

collection.each do |i|
  break if i == 3
  ...many lines
end

... แน่นอนว่านี่เป็นการสมมติว่าคุณไม่ต้องการคืนค่าจริง ๆ เพียงแค่แยกออกจากบล็อก


สิ่งนี้จะไม่เพียงแค่กลับมาจากบล็อก แต่จะกลับมาจากแต่ละครั้ง ดังนั้นการวนซ้ำจะสิ้นสุดไม่ดำเนินการต่อด้วยค่าถัดไป ไม่แน่ใจว่านั่นคือสิ่งที่ตั้งใจไว้
sepp2k

4
คุณสามารถใช้ค่ากับbreakใน Ruby - break 5จะทำให้eachกลับมา 5
Chuck

1
ขอบคุณ แต่ฉันไม่ต้องการหยุดการทำซ้ำ
ryeguy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.