Applescript эквивалент «продолжить»? - PullRequest
34 голосов
/ 22 июня 2009

У меня есть простой «повторить с» в AppleScript, и я хотел бы перейти к следующему пункту в «повторять» условно. В основном я ищу что-то похожее на «продолжить» (или перерыв?) На других языках.

Я не очень разбираюсь в AppleScript, но я нашел его полезным несколько раз.

Ответы [ 6 ]

44 голосов
/ 24 июня 2009

После поиска именно этой проблемы я нашел выписку из книги онлайн. Это точно отвечает на вопрос, как пропустить текущую итерацию и перейти прямо к следующей итерации цикла repeat.

Applescript имеет 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.

7 голосов
/ 08 ноября 2010
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

Это все еще даст вам возможность «повторить выход»

6 голосов
/ 15 мая 2011
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, которое генерирует любую непредвиденную ошибку.

2 голосов
/ 22 февраля 2013

Вы все это усложняете. Попробуйте это:

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
2 голосов
/ 20 февраля 2013

- Или вы могли бы использовать другую стратегию: использовать цикл для цикла и сделать условную логику в обработчике, например так:

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
1 голос
/ 24 января 2016

Вы также можете использовать «repeat while» для циклов, которые повторяются только условно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...