C/C#
जैसे ऐसा करने का कोई तरीका है?एफ # ब्रेक जबकि लूप
उदाहरण के लिए (सी # शैली)
for(int i=0; i<100; i++)
{
if(i==66)
break;
}
C/C#
जैसे ऐसा करने का कोई तरीका है?एफ # ब्रेक जबकि लूप
उदाहरण के लिए (सी # शैली)
for(int i=0; i<100; i++)
{
if(i==66)
break;
}
कम जवाब नहीं है। आप आमतौर पर समान कार्यक्षमता व्यक्त करने के लिए कुछ उच्च-आदेश फ़ंक्शन का उपयोग करेंगे। ऐसे कई कार्य हैं जो आपको विभिन्न पैटर्न के अनुरूप ऐसा करने देते हैं (इसलिए यदि आप वर्णन करते हैं कि आपको वास्तव में क्या चाहिए, तो कोई आपको बेहतर उत्तर दे सकता है)।
seq { 0 .. 100 } |> Seq.tryFind (fun i ->
printfn "%d" i
i=66)
व्यवहार में, इस करता है, तो जाने के लिए सबसे अच्छा तरीका है:
उदाहरण के लिए, tryFind
समारोह जो आप कुछ इस तरह लिखने देता है एक दृश्य है जिसके लिए किसी दिए गए विधेय रिटर्न true
, से पहले मान देता है आप कुछ उच्च स्तरीय तर्क व्यक्त कर रहे हैं और एक संबंधित कार्य है।
let rec loop n =
if n < 66 then
printfn "%d" n
loop (n + 1)
loop 0
एक और अधिक विदेशी विकल्प (जो के रूप में कुशल नहीं है, लेकिन DSLs के लिए अच्छा हो सकता है) है कि आप एक गणना अभिव्यक्ति को परिभाषित कर सकते है: क्या तुम सच में break
की तरह कुछ व्यक्त करने के लिए की जरूरत है, तो आप एक पुनरावर्ती समारोह का उपयोग कर सकते जो आपको break
और continue
लिखने देता है। Here is an example, लेकिन जैसा कि मैंने कहा, यह उतना कुशल नहीं है।
आपको इसे थोड़ी देर के लिए बदलना होगा।
let (i, ans) = (ref 0, ref -1)
while(!i < 100 and !ans < 0) do
if !i = 66 then
ans := !i
ans
(यह टूट जाता है जब मैं 66 के लिए हो जाता है - लेकिन हां वाक्य रचना काफी अलग आदि है, एक और चर शुरू की है,)
यह वास्तव में बदसूरत है, लेकिन मेरे मामले में यह काम किया।
let mutable Break = false
while not Break do
//doStuff
if breakCondition then
Break <- true
done
इस के लिए उपयोगी है do-while लूप में है, क्योंकि यह गारंटी देता है कि पाश में कम से कम एक बार निष्पादित कर रहा है।
मुझे आशा है कि एक और अधिक सुरुचिपूर्ण समाधान होगा। मुझे रिकर्सिव पसंद नहीं है, क्योंकि मैं स्टैक ओवरफ्लो से डरता हूं। :-(
seq {
for i = 0 to 99 do
if i = 66 then yield()
}
|> Seq.tryItem 0
|> ignore
समस्याओं के इन प्रकार के लिए आप एक पुनरावर्ती क्रिया इस्तेमाल कर सकते हैं
let rec IfEqualsNumber start finish num =
if start = finish then false
elif
start = num then true
else
let start2 = start + 1
IfEqualsNumber start2 finish num
आज़माएं:।
exception BreakException
try
for i = 0 to 99 do
if i = 66 then
raise BreakException
with BreakException ->()
मुझे पता है कि कुछ लोगों को उपयोग करने के लिए पसंद नहीं है अपवाद। लेकिन इसमें योग्यता है।
आप जटिल रिकर्सिव फ़ंक्शन के बारे में सोचना नहीं है। का कारण आप ऐसा कर सकते हैं, लेकिन कभी-कभी यह अनावश्यक रूप से परेशान होता है और अपवाद का उपयोग करना आसान है।
यह विधि आपको लूप बॉडी के आधे रास्ते में तोड़ने की अनुमति देती है। (ब्रेक "ध्वज" विधि भी सरल है लेकिन यह केवल लूप बॉडी के अंत में तोड़ने की अनुमति देता है।)
आप आसानी से नेस्टेड लूप से बच सकते हैं।
और चूंकि यह 'i' में वृद्धि नहीं करता है, यह वास्तव में काफी समय लगता है। :-) –