Applescript odpowiednik "continue"?
Mam proste 'repeat with' W Applescripcie i chciałbym przejść do następnego elementu w "repeat" warunkowo. Zasadniczo szukam czegoś podobnego do "continue" (lub break?) w innych językach.
Nie jestem dobrze zaznajomiony z AppleScript, ale uznałem to za przydatne kilka razy teraz.
6 answers
Szukając dokładnie tego problemu, znalazłem wyciąg z książki w Internecie. Dokładnie odpowiada na pytanie, jak pominąć bieżącą iterację i przejść od razu do następnej iteracji pętli repeat
.
Applescript ma exit repeat
, który całkowicie zakończy pętlę, pomijając wszystkie pozostałe iteracje. Może to być przydatne w nieskończonej pętli, ale nie jest to, czego chcemy w tym przypadku.
Najwyraźniej funkcja podobna do continue
nie istnieje w AppleScript, ale oto sztuczka, aby
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
Wyświetli okna dialogowe dla 1, 2, 4 i 5.
Tutaj stworzyłeś dwie pętle: pętla zewnętrzna jest twoją rzeczywistą pętlą, pętla wewnętrzna jest pętlą, która powtarza się tylko raz. exit repeat
opuści pętlę wewnętrzną, kontynuując pętlę zewnętrzną: dokładnie to, czego chcemy!
exit repeat
.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 17:16:57
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
To nadal daje możliwość "powtórzenia wyjścia"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-07 21:31:12
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
Bazując na powyższym podejściu try block, ale czyta się nieco lepiej. Oczywiście, ponieważ continueRepeat nie jest zdefiniowany, zostanie wyrzucony błąd, który spowoduje pominięcie reszty bloku try.
Aby zachować błąd rzucania w Nienaruszonym zawierać klauzulę on error, która rzuca każdy nieoczekiwany błąd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-15 09:02:59
-- lub możesz użyć innej strategii: użyj pętli do pętli i wykonaj logikę warunkową w obsłudze, jak tak:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 15:15:06
Wszyscy to komplikujecie. Spróbuj tego:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 18:09:04
Można również użyć "repeat while" dla pętli, które powtarzają się tylko warunkowo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-24 17:35:06