คุณมีสามตัวเลือก (หรือมากกว่านั้น) ที่จะแยกออกจากลูป
สมมติว่าคุณต้องการหาผลรวมตัวเลขจนกว่าผลรวมจะมากกว่า 1,000 คุณลอง
var sum = 0
for (i <- 0 to 1000) sum += i
ยกเว้นคุณต้องการหยุดเมื่อ (รวม> 1,000)
จะทำอย่างไร? มีหลายตัวเลือก
(1a) ใช้โครงสร้างที่มีเงื่อนไขที่คุณทดสอบ
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(คำเตือน - สิ่งนี้ขึ้นอยู่กับรายละเอียดว่าการทดสอบแบบ TakeWhile และ foreach นั้นเป็นอย่างไรในระหว่างการประเมินผลและอาจไม่ควรใช้ในทางปฏิบัติ!)
(1b) ใช้การเรียกซ้ำแบบหางแทนการวนซ้ำเพื่อใช้ประโยชน์จากความง่ายในการเขียนวิธีการใหม่ใน Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) ถอยกลับไปใช้ลูปสักครู่
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) โยนข้อยกเว้น
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) ใน Scala 2.8+ สิ่งนี้ได้รับการจัดทำแพ็กเกจไว้ล่วงหน้าในการscala.util.control.Breaks
ใช้ไวยากรณ์ที่มีลักษณะเหมือนตัวแบ่งเก่าที่คุณคุ้นเคยจาก C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) ใส่รหัสในวิธีการและใช้ผลตอบแทน
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
สิ่งนี้ถูกสร้างขึ้นโดยเจตนาไม่ง่ายเกินไปด้วยเหตุผลอย่างน้อยสามประการที่ฉันสามารถนึกถึง ก่อนอื่นในบล็อคโค้ดขนาดใหญ่มันง่ายที่จะมองข้ามคำสั่ง "ทำต่อไป" และ "หยุด" หรือคิดว่าคุณแยกออกไม่มากไปกว่าที่คุณเป็นจริงหรือต้องแบ่งสองลูปที่คุณไม่สามารถทำได้ อย่างไรก็ตามการใช้งานมาตรฐานในขณะที่สะดวกมีปัญหาและทำให้คุณควรพยายามจัดโครงสร้างโค้ดของคุณในวิธีที่ต่างออกไป ประการที่สองสกาล่ามีการทำรังทุกประเภทที่คุณอาจไม่สังเกตเห็นดังนั้นถ้าคุณสามารถแยกแยะสิ่งต่าง ๆ ออกมาได้คุณอาจจะประหลาดใจกับที่การไหลของรหัสสิ้นสุดลง (โดยเฉพาะอย่างยิ่งกับการปิด) ประการที่สาม "ลูป" ของสกาล่าส่วนใหญ่ไม่ใช่ลูปปกติจริง ๆ - พวกเขาเรียกวิธีใช้ที่มีการวนซ้ำของตัวเองการวนซ้ำมันยากที่จะเกิดขึ้นด้วยวิธีที่สอดคล้องกันเพื่อรู้ว่า "หยุด" และสิ่งที่ควรทำ ดังนั้นเพื่อให้สอดคล้องสิ่งที่ควรทำคือไม่ต้องมี "การหยุด" เลย
หมายเหตุ : มีฟังก์ชันที่เทียบเท่ากับสิ่งเหล่านี้ทั้งหมดที่คุณส่งคืนค่าsum
แทนที่จะกลายพันธุ์แทน เหล่านี้เป็น Scala สำนวนมากขึ้น อย่างไรก็ตามตรรกะยังคงเหมือนเดิม ( return
กลายเป็นreturn x
ฯลฯ )