2009-06-21 14 views
31

मेरे पास एक ऐप्पलस्क्रिप्ट में एक सरल 'दोहराना' है, और सशर्त रूप से "दोहराएं" में अगले आइटम पर जाना चाहूंगा। असल में मैं अन्य भाषाओं में "जारी रखें" (या ब्रेक?) के समान कुछ ढूंढ रहा हूं।एप्पलस्क्रिप्ट "जारी रखें" के बराबर है?

मुझे ऐप्पलस्क्रिप्ट में अच्छी तरह से पता नहीं है लेकिन मुझे अब कुछ बार उपयोगी पाया गया है।

उत्तर

42

इस सटीक समस्या की खोज करने के बाद, मुझे यह book extract ऑनलाइन मिला। यह वर्तमान पुनरावृत्ति को छोड़ने और repeat लूप के अगले पुनरावृत्ति पर सीधे कूदने के सवाल का जवाब देता है।

एप्पलस्क्रिप्ट में exit repeat है, जो पूरी तरह से लूप को समाप्त कर देगा, शेष शेष पुनरावृत्तियों को छोड़ देगा। यह एक अनंत लूप में उपयोगी हो सकता है, लेकिन हम इस मामले में जो चाहते हैं वह नहीं है।

जाहिर है एक continue की तरह सुविधा AppleScript में मौजूद नहीं है, लेकिन यहाँ एक चाल यह अनुकरण करने के लिए है:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    repeat 1 times -- # fake loop 
     set value to item 1 of anItem 

     if value = "3" then exit repeat -- # simulated `continue` 

     display dialog value 
    end repeat 
end repeat 

यह 1, 2, 4 और 5 के

के लिए संवाद प्रदर्शित करेगा यहां, आपने दो लूप बनाए हैं: बाहरी लूप आपका वास्तविक पाश है, आंतरिक लूप एक लूप है जो केवल एक बार दोहराता है। exit repeat आंतरिक पाश से बाहर निकल जाएगा, बाहरी पाश के साथ जारी: बिल्कुल वही हम क्या चाहते हैं!

जाहिर है, यदि आप इसका उपयोग करते हैं, तो आप सामान्य exit repeat करने की क्षमता खो देंगे।

+1

उपरोक्त कोड संकलित नहीं होगा क्योंकि सेबस्क्रिप्ट में टिप्पणियां हैं - # – alexy13

+1

एप्सस्क्रिप्ट 2.0 में # संकेतों के लिए भी अनुमति की अनुमति है: https://developer.apple.com/library/mac/documentation/applescript/ वैचारिक/सेबस्क्रिप्टलिंगगाइड/वैचारिक/ASLR_lexical_conventions.html # // apple_ref/doc/uid/TP40000983-CH214-SW8 – Joakim

+0

कोड किसी भी तरह संकलित करेगा क्योंकि "-" सभी "#" से पहले और "-" ने हमेशा चिह्नित किया है ऐप्पलस्क्रिप्ट में टिप्पणी। –

6
set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    try 
     set value to item 1 of anItem 

     if value = "3" then error 0 -- # simulated `continue` 

     log value 
    end try 
end repeat 

यह अभी भी आप "से बाहर निकलें दोहराने" possibillity

4
set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList -- # actual loop 
    try -- # needed to simulate continue 
     set value to item 1 of anItem 
     if value = "3" then continueRepeat -- # simulated `continue` throws an error to exit the try block 

     log value 
    on error e 
     if e does not contain "continueRepeat" then error e -- # Keeps error throwing intact 
    end try 
end repeat 

ऊपर कोशिश ब्लॉक आधारित दृष्टिकोण के आधार पर दे लेकिन थोड़ा बेहतर पढ़ता होगा। बेशक, जारी रखने के बाद से दोहराना परिभाषित नहीं किया गया है एक त्रुटि फेंक दी जाएगी जिससे शेष प्रयास ब्लॉक को छोड़ दिया जा सकता है।

त्रुटि फेंकने को रोकने के लिए त्रुटि त्रुटि पर शामिल है जो किसी भी अप्रत्याशित त्रुटि को फेंकता है।

2

- या आप अलग रणनीति इस्तेमाल कर सकते हैं: पाश के पाश का उपयोग करें, और इतने की तरह एक हैंडलर में सशर्त तर्क करते हैं,:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList 
    doConditionalWork(anItem as string) 
end repeat 

on doConditionalWork(value) 

    if value = "3" then return 

    display dialog value 

end doConditionalWork 
2

तुम सब सब यह overcomplicating कर रहे हैं। इसे आज़माएं:

set aList to {"1", "2", "3", "4", "5"} 

repeat with anItem in aList 
    set value to item 1 of anItem 
    if value is not "3" then log value 
end repeat 
1

आप लूप के लिए "दोहराना" भी उपयोग कर सकते हैं जो केवल सशर्त रूप से दोहराया जाता है।