आपके पास छोरों को तोड़ने के लिए तीन (या तो) विकल्प हैं।
मान लीजिए कि आप कुल संख्या 1000 से अधिक होने तक संख्याओं को जोड़ना चाहते हैं। आप प्रयास करें
var sum = 0
for (i <- 0 to 1000) sum += i
सिवाय इसके कि आप कब रुकना चाहते हैं (राशि> 1000)।
क्या करें? कई विकल्प हैं।
(1 ए) कुछ निर्माण का उपयोग करें जिसमें एक शर्त शामिल है जिसे आप परीक्षण करते हैं।
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(चेतावनी - यह इस बात पर निर्भर करता है कि मूल्यांकन के दौरान टेकवाइल टेस्ट और फॉर्च्यूस को कैसे इंटरलेक्ट किया गया है, और शायद इसका उपयोग अभ्यास में नहीं किया जाना चाहिए!)।
(1 बी) लूप के बजाय टेल रिकर्सियन का उपयोग करें, इसका फायदा उठाकर स्कैला में एक नई विधि लिखना कितना आसान है:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1 सी) थोड़ी देर लूप का उपयोग करने के लिए वापस गिरें
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(२) अपवाद फेंकना।
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) स्काला 2.8+ में यह पहले से ही scala.util.control.Breaks
सिंटैक्स का उपयोग करने में पहले से पैक है जो सी / जावा से आपके परिचित पुराने ब्रेक की तरह दिखता है:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(३) कोड को एक विधि में रखें और रिटर्न का उपयोग करें।
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
यह जानबूझकर किया गया है, कम से कम तीन कारणों से जो मैंने सोचा हो सकता है के लिए बहुत आसान नहीं है। सबसे पहले, बड़े कोड ब्लॉक में, "जारी" और "ब्रेक" बयानों को अनदेखा करना आसान है, या यह सोचने के लिए कि आप वास्तव में हैं, या दो छोरों को तोड़ने की ज़रूरत है जो आप नहीं कर सकते। वैसे भी आसानी से - इसलिए मानक उपयोग, जबकि काम, इसकी समस्याएं हैं, और इस प्रकार आपको अपने कोड को एक अलग तरीके से बनाने की कोशिश करनी चाहिए। दूसरा, स्कैला में सभी प्रकार के घोंसले होते हैं जिन्हें आप शायद नोटिस भी नहीं करते हैं, इसलिए यदि आप चीजों से बाहर निकल सकते हैं, तो आप शायद आश्चर्यचकित होंगे कि कोड प्रवाह समाप्त कैसे हुआ (विशेष रूप से क्लोजर के साथ)। तीसरा, स्काला के अधिकांश "लूप्स" वास्तव में सामान्य लूप नहीं हैं - वे विधि कॉल हैं जिनके पास अपना लूप है,looplike, यह जानने के लिए एक सुसंगत तरीके के साथ आना मुश्किल है कि "ब्रेक" और इस तरह क्या करना चाहिए। तो, सुसंगत होने के लिए, समझदार बात यह है कि "ब्रेक" बिल्कुल नहीं है।
नोट : इन सभी के कार्यात्मक समतुल्य हैं जहाँ आप sum
इसे स्थान पर बदलने के बजाय इसका मूल्य लौटाते हैं । ये अधिक मुहावरेदार स्काला हैं। हालाँकि, तर्क वही रहता है। ( return
बन जाता है return x
, आदि)।