2011-05-19 3 views
52

CoffeeScript में, while पाश आता मानक:क्या कर रहे थे ... जबकि 'कॉफीस्क्रिप्ट से बाहर loops ...?

while x() 
    y() 

हालांकि, निम्नलिखित काम नहीं करता:

do 
    y() 
while x() 

और यह केवल पहले उदाहरण के लिए चीनी है:

y() while x() 

क्या कॉफीस्क्रिप्ट एक अंतर्निर्मित लूप के साथ आता है जो कम से कम एक बार निष्पादित करता है?

एक अलग रूप में के रूप में, do एक कीवर्ड है - यह अनाम प्रक्रियाएं कॉल करने के लिए प्रयोग किया जाता है।

+7

ओटी, लेकिन मैंने 'कॉफ़ीस्क्रिप्ट' टैग के विवरण पर लिखा। :) –

+0

किसी को खुद से पूछना चाहिए कि क्या दिया गया निर्माण बिल्कुल वांछनीय है। 'while' और' do ... के बीच महत्वपूर्ण अंतर यह है कि लूप बॉडी को एक बार निष्पादित किया जाता है, क्योंकि लूप बॉडी के निष्पादन के बाद ही स्थिति की जांच की जाती है। सीएस में आप आसानी से ऐसा कर सकते हैं जो 'करते हैं ... तोड़ें ...' या 'करें ... जब तक ...'निर्माण जो केवल साफ और * के रूप में पढ़ता है * लूप बॉडी में किसी भी पंक्ति पर' ब्रेक 'हो सकता है। यह पास्कल की 'दोहराना ... तक' जैसी समान संरचनाओं पर भी लागू होता है। – flow

+0

@flow 'do ... तोड़ें ... 'IIFE दंड –

उत्तर

63

CoffeeScript प्रलेखन कहते हैं:

केवल निम्न स्तर के पाश कि CoffeeScript प्रदान करता है, जबकि पाश है।

मैं नहीं जानता कि एक अंतर्निहित पाश कि कम से कम एक बार निष्पादित करता है, इसलिए मुझे लगता है कि विकल्प

loop 
    y() 
    break if x() 
+0

+1 यही मुझे डर था। एक त्वरित वेब खोज से पता चलता है कि कई ब्लॉग्स "डू-एंड" लूप के लिए कॉफीस्क्रिप्ट के समर्थन का उल्लेख करते हैं, लेकिन वे ब्लॉग निश्चित रूप से गलत दिखते हैं। – ClosureCowboy

+22

ध्यान दें कि यह 'do'-'until' अनुकरण करता है; आपको 'do'-'while' के लिए 'ब्रेक' की आवश्यकता है। – matyr

+0

[लूप प्रलेखन से लिंक] (http://coffeescript.org/#loops) – reergymerej

16

आपका अनुमान सही है: कोई do-while CoffeeScript में बराबर है।

doWhile = (func, condition) -> 
    func() 
    func() while condition() 
+2

यह 'लूप पर क्यों; y(); ब्रेक जब तक एक्स(); '? – Soumya

+0

अच्छा सवाल। मैंने जंगली में 'लूप' का उपयोग बहुत ज्यादा नहीं देखा है, लेकिन इसके लिए यह सबसे समझदार उपयोग केस है। –

0

मैं एक परियोजना पर काम कर रहा है, जहां मैं बस करने के लिए शर्त के लिए मजबूर: तो आप आम तौर पर

y() 
y() while x() 

लिखते हैं आप पाते हैं अपने आप को अक्सर यह कर, तो आप एक सहायक समारोह परिभाषित कर सकता है लूप के अंत में मूल्यांकन करें, फिर शुरुआत में समाप्त करें।

# set the 'do' variable to pass the first time 
do = true 
while do 

    # run your intended code 
    x() 

    # evaluate condition at the end of 
    # the while code block 
    do = condition 

# continue code 

यह बहुत ही सुंदर नहीं है, लेकिन यह सिर्फ आपके जबकि कोड ब्लॉक के लिए एक नया समारोह को परिभाषित करने और इसे दो बार चलने से आप रखता है। आम तौर पर कथन के दौरान कोड करने का एक तरीका है ... बयान के दौरान, लेकिन उन समय के लिए जब आप एक साधारण समाधान नहीं कर सकते हैं।

+16

'do' कॉफीस्क्रिप्ट में आरक्षित शब्द है। यह वास्तव में पाठक को भ्रमित करेगा। – Mitar

24

मुझे पता है कि यह उत्तर बहुत पुराना है, लेकिन जब से मैं Google के माध्यम से यहां प्रवेश करता हूं, मैंने सोचा कि कोई और भी हो सकता है।

एक निर्माण करने के लिए करते हैं ... जबकि CoffeeScript में पाश बराबर मुझे लगता है कि इस वाक्य यह सबसे अच्छा और आसान emulates और बहुत पठनीय है:

while true 
    # actions here 
    break unless # conditions here 
+6

'जबकि सत्य' को 'लूप' के रूप में लिखा जा सकता है (और अधिक वर्णनात्मक है: आप एक लूप बना रहे हैं, और यह 'सत्य' तक जारी नहीं है) – 1j01

+2

@ 1j01 पीछे से मैं सहमत हूं कि 'लूप' अर्थात् है लगभग दो वर्षों के बाद बेहतर है, लेकिन यह एक विकल्प है और कुछ वर्षों तक कॉफीस्क्रिप्ट के साथ अपने जेएस लिखने के बाद भी यह मेरी पसंदीदा विधि है, शायद बस एक आदत से बाहर। – adrenalin

+0

........... के :) – 1j01

1

मैं इस एक शॉर्ट सर्किट सशर्त के माध्यम से पूरा किया जा सकता पाया :

flag = y() while not flag? or x() 
संबंधित मुद्दे