Подтвердить что ты не робот

Аппликационный эквивалент "продолжить"?

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

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

4b9b3361

Ответ 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" для циклов, которые только повторяются условно.