Equivalente in calce di "continua"?
-
06-07-2019 - |
Domanda
Ho una semplice "ripetizione con" in un AppleScript e vorrei passare all'elemento successivo nella sezione "ripeti". condizionalmente. Fondamentalmente sto cercando qualcosa di simile a " continua " (o pausa?) in altre lingue.
Non sono esperto di AppleScript ma l'ho trovato utile alcune volte.
Soluzione
Dopo aver cercato questo esatto problema, ho trovato questo estratto del libro online. Risponde esattamente alla domanda su come saltare l'attuale iterazione e passare direttamente alla successiva iterazione di un ciclo repeat
.
Applescript ha exit repeat
, che terminerà completamente un ciclo, saltando tutte le iterazioni rimanenti. Questo può essere utile in un ciclo infinito, ma non è quello che vogliamo in questo caso.
Apparentemente una funzione simile a continue
non esiste in AppleScript, ma ecco un trucco per simularla:
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
Verranno visualizzate le finestre di dialogo per 1, 2, 4 e 5.
Qui hai creato due loop: il loop esterno è il tuo loop reale, il loop interno è un loop che si ripete solo una volta. Il exit repeat
uscirà dal loop interno, continuando con il loop esterno: esattamente quello che vogliamo!
Ovviamente, se lo usi, perderai la possibilità di fare un normale exit repeat
.
Altri suggerimenti
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
Questo ti consentirà comunque di " exit repeat " possibillity
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
Basato sull'approccio basato su blocco di prova sopra ma legge leggermente meglio. Naturalmente, poiché continueRepeat non è definito, verrà generato un errore che farà saltare il resto del blocco try.
Per mantenere intatto il lancio dell'errore, includere la clausola on error che genera qualsiasi errore imprevisto.
- Oppure potresti usare una strategia diversa: usa il ciclo per eseguire il ciclo e fai la logica condizionale in un gestore, in questo modo:
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
Lo state tutti complicando troppo. Prova questo:
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
Puoi anche usare & # 8220; ripeti mentre & # 8221; per i loop che si ripetono solo in modo condizionale.