«Продолжить» (до следующей итерации) в VBScript - PullRequest
43 голосов
/ 15 октября 2010

Мы с коллегой пытались найти способ сделать эквивалент оператора «continue» в цикле VBScript «For / Next».

Везде, куда мы смотрели, мы видели, что у людей не было возможности сделать это в VBScript без неприятных вложений, что для нас не вариант, поскольку это довольно большой цикл.

Мы выступили с этой идеей. Будет ли это работать как «продолжить (до следующей итерации)»? Есть ли у кого-нибудь лучшее решение для обхода или улучшения?

For i=1 to N
  For workaroundloop = 1 to 1
    [Code]
    If Condition1 Then
      Exit For
    End If

    [MoreCode]
    If Condition2 Then
      Exit For
    End If

    [MoreCode]
    If Condition2 Then
      Exit For
    End If

    [...]

  Next
Next

Спасибо за ваши комментарии

Ответы [ 7 ]

43 голосов
/ 15 октября 2010

Ваше предложение будет работать, но использование цикла Do может быть более читабельным.

На самом деле это идиома в C - вместо использования goto можно использовать цикл do {} while (0) с оператором break, если вы хотите выйти из конструкции раньше.

Dim i

For i = 0 To 10
    Do
        If i = 4 Then Exit Do
        WScript.Echo i
    Loop While False
Next

Как подсказывает давка, выглядит немного лучше, если вы удалите дополнительный уровень отступа.

Dim i

For i = 0 To 10: Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False: Next
7 голосов
/ 28 июня 2013

Решение, которое я выбрал, включало использование логической переменной для отслеживания, должен ли цикл for обрабатывать свои инструкции или переходить к следующей итерации:

Dim continue

For Each item In collection
    continue = True

    If condition1 Then continue = False End If

    If continue Then
        'Do work
    End If
Next

Я обнаружил, что решения с вложенными циклами несколько сбивают с толку читаемость. Этот метод также имеет свои подводные камни, поскольку цикл не сразу пропускает следующую итерацию после встречи с continue. Для более позднего условия было бы возможно изменить состояние continue. Он также имеет вторичную конструкцию в начальном цикле и требует объявления дополнительной переменной.

О, VBScript ... вздох.

Кроме того, если вы хотите использовать принятый ответ, что не так уж плохо с точки зрения читабельности, вы можете соединить его с помощью :, чтобы объединить два цикла в один:

Dim i

For i = 0 To 10 : Do
    If i = 4 Then Exit Do
    WScript.Echo i
Loop While False : Next

Мне показалось полезным устранить дополнительный уровень отступов.

6 голосов
/ 15 октября 2010

Один из вариантов - поместить весь код в цикл внутри Sub, а затем просто вернуться из этого Sub, если вы хотите "продолжить".

Не идеально, но я думаю, что было бы менее запутанным, чем дополнительный цикл.

Edit: или я полагаю, если вы достаточно смелы, вы могли бы использовать Goto, чтобы каким-то образом перейти к началу цикла (убедившись, что счетчик обновляется правильно), я думаю, что VBScript поддерживает это, но Ваша репутация может пострадать, если кто-то обнаружит, что вы используете Goto в своем коде:)

4 голосов
/ 20 октября 2010

Я часто использую Do, Loop, но я начал использовать Sub или Function, из которых я мог бы выйти вместо этого.Мне это показалось чище.Если какие-либо переменные, которые вам нужны, не являются глобальными, вам нужно будет также передать их в Sub.

For i=1 to N
 DoWork i
Next

Sub DoWork(i)
    [Code]
    If Condition1 Then
      Exit Sub
    End If

    [MoreCode]
    If Condition2 Then
      Exit Sub
    End If

    [MoreCode]
    If Condition2 Then
      Exit Sub
    End If

    [...]
End Sub
0 голосов
/ 05 февраля 2015

Попробуйте использовать операторы While / Wend и Do While / Loop ...

i = 1
While i < N + 1
Do While true
    [Code]
    If Condition1 Then
       Exit Do
    End If

    [MoreCode]
    If Condition2 Then
       Exit Do
    End If

    [...]

    Exit Do
Loop
Wend
0 голосов
/ 10 января 2014

Мы можем использовать отдельную функцию для выполнения оператора продолжения. предположим, у вас есть следующая проблема:

for i=1 to 10

if(condition) then   'for loop body'
contionue
End If

Next

Здесь мы будем использовать вызов функции для тела цикла:

for i=1 to 10
Call loopbody()
next

function loopbody()

if(condition) then   'for loop body'
Exit Function
End If

End Function

цикл будет продолжен для оператора выхода из функции ....

0 голосов
/ 15 октября 2010

Реализуйте итерацию как рекурсивную функцию.

Function Iterate( i , N )
  If i == N Then
      Exit Function
  End If
  [Code]
  If Condition1 Then
     Call Iterate( i+1, N );
     Exit Function
  End If

  [Code]
  If Condition2 Then
     Call Iterate( i+1, N );
     Exit Function
  End If
  Call Iterate( i+1, N );
End Function

Начните с вызова Iterate (1, N)

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