同僚と私は、VBScriptの「For/Next」ループ内で「continue」ステートメントに相当する方法を見つけようとしていました。
私たちが見たすべての場所で、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
コメントしてくれてありがとう
提案は機能しますが、Doループを使用する方が読みやすいかもしれません。
これは実際にはCのイディオムです。gotoを使用する代わりに、構文から早く脱出したい場合は、breakステートメントでdo {} while(0)ループを使用できます。
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
私が決定した解決策は、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
の状態を反転させることができます。また、初期ループ内に2次構造があり、追加のvarの宣言が必要です。
ああ、VBScript ...ため息。
また、受け入れられた答えを使用したい場合は、読みやすさはそれほど悪くありませんが、:
2つのループを1つのループにマージします。
Dim i
For i = 0 To 10 : Do
If i = 4 Then Exit Do
WScript.Echo i
Loop While False : Next
余分なレベルのインデントを排除することが有用であることがわかりました。
1つのオプションは、ループ内のすべてのコードをSub
内に配置し、「継続」したいときにそのSub
から戻るだけです。
完璧ではありませんが、余分なループの方が混乱が少ないと思います。
編集:または、勇気があれば、何らかの方法でGoto
を使用してループの先頭にジャンプできれば(カウンターが正しく更新されることを確認して)、VBScriptがそれをサポートすると思いますが、コードでGoto
を使用していることを誰かが発見した場合、評判が低下する可能性があります。
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
反復を再帰関数として実装します。
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)の呼び出しで開始します
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
が好きではない とにかく。
Continueステートメントの作業を実行するために別の関数を使用できます。次の問題があると仮定します。
for i=1 to 10
if(condition) then 'for loop body'
contionue
End If
Next
ここでは、forループ本体の関数呼び出しを使用します。
for i=1 to 10
Call loopbody()
next
function loopbody()
if(condition) then 'for loop body'
Exit Function
End If
End Function
ループは、関数exitステートメントに対して続行されます。..
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