"Продолжить" (на следующую итерацию) на VBScript

мы с коллегой пытались найти способ сделать эквивалент оператора " 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 ответов


ваше предложение будет работать, но использование цикла 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

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

Dim i

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

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

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

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


решение, которое я решил, включало использование булевой переменной для отслеживания, если 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. Она также имеет вторичная конструкция внутри начального цикла и требует объявления дополнительного var.

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

кроме того, если вы хотите использовать принятый ответ, который не слишком плох для чтения, вы можете связать это с использованием : объединить две петли в то, что кажется один:

Dim i

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

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


Я использую Do, Loop много, но я начал использовать 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

выполнить итерации как рекурсивную функцию.

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

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


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

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

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


попробуйте использовать операторы 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