"Продолжить" (на следующую итерацию) на 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
Спасибо за ваши комментарии
Ответы
Ответ 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
.