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

"Продолжить" (на следующую итерацию) на 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

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

4b9b3361

Ответ 1

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

На самом деле это идиома в C - вместо использования goto, вы можете иметь цикл {} 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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Я использую Do, Loop много, но я начал использовать Sub или функцию, из которой я мог бы выйти из нее. Мне это показалось мне чище. Если требуемые переменные не являются глобальными, вам также необходимо передать их в 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

Ответ 5

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

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)

Ответ 6

Мы можем использовать отдельную функцию для выполнения работы оператора 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

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

Ответ 7

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

Ответ 8

Я думаю, что вы должны содержать ВСЕ ВАШУ ЛОГИКУ согласно вашему заявлению if. В основном:

' PRINTS EVERYTHING EXCEPT 4
For i = 0 To 10
  ' you want to say
  ' If i = 4 CONTINUE but VBScript has no continue
  If i <> 4 Then ' just invert the logic
    WSH.Echo( i )
  End If
Next

Это может сделать код немного длиннее, но некоторым людям все равно не нравятся break или continue.