Аппликационный эквивалент "продолжить"?
У меня есть простой "повтор с" в AppleScript, и я хотел бы перейти к следующему элементу в "повторении" условно. В основном я ищу что-то похожее на "продолжить" (или перерыв?) На других языках.
Я не хорошо разбираюсь в AppleScript, но я нашел его полезным несколько раз.
Ответы
Ответ 1
После поиска этой точной проблемы я нашел этот book extract онлайн. Он точно отвечает на вопрос о том, как пропустить текущую итерацию и перейти прямо к следующей итерации цикла repeat
.
Applescript имеет exit repeat
, который полностью завершит цикл, пропуская все оставшиеся итерации. Это может быть полезно в бесконечном цикле, но это не то, что мы хотим в этом случае.
По-видимому, в AppleScript не существует функции continue
-like, но вот трюк для ее имитации:
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
.
Ответ 2
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
Это все равно даст вам возможность "повторного выхода"
Ответ 3
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
На основе вышеприведенного подхода, основанного на методе try, но немного лучше. Конечно, поскольку continueRepeat не определен, будет выведена ошибка, из-за которой остальная часть блока try будет пропущена.
Чтобы сохранить неповрежденную ошибку, включите предложение on error, которое вызывает любую непредвиденную ошибку.
Ответ 4
- Или вы можете использовать другую стратегию: использовать цикл для цикла и выполнять условную логику в обработчике, например:
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
Ответ 5
Все это слишком сильно. Попробуйте следующее:
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
Ответ 6
Вы также можете использовать "repeat while" для циклов, которые только повторяются условно.