web-dev-qa-db-ja.com

VBScriptでの「次へ」(次の反復へ)

同僚と私は、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

コメントしてくれてありがとう

44
EKI

提案は機能しますが、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
43
Tmdean

私が決定した解決策は、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

余分なレベルのインデントを排除することが有用であることがわかりました。

7
crush

1つのオプションは、ループ内のすべてのコードをSub内に配置し、「継続」したいときにそのSubから戻るだけです。

完璧ではありませんが、余分なループの方が混乱が少ないと思います。

編集:または、勇気があれば、何らかの方法でGotoを使用してループの先頭にジャンプできれば(カウンターが正しく更新されることを確認して)、VBScriptがそれをサポートすると思いますが、コードでGotoを使用していることを誰かが発見した場合、評判が低下する可能性があります。

6
Hans Olsson

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
4
wsware

反復を再帰関数として実装します。

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)の呼び出しで開始します

0
Captain Giraffe

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

これにより、コードが少し長くなりますが、一部の人々 breakcontinueが好きではない とにかく。

0
bobobobo

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ステートメントに対して続行されます。..

0
Ravi Likhar

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