web-dev-qa-db-fra.com

"Continuer" (jusqu'à la prochaine itération) sur VBScript

Un collègue et moi essayions de trouver un moyen de faire l'équivalent d'une instruction "continue" dans une boucle VBScript "For/Next".

Partout où nous avons regardé, nous avons constaté que les gens n'avaient aucun moyen de le faire dans VBScript sans avoir des imbrications désagréables, ce qui n'est pas une option pour nous car c'est une boucle assez importante.

Nous sommes sortis avec cette idée. Cela fonctionnerait-il comme une "poursuite (jusqu'à la prochaine itération)"? Quelqu'un a-t-il une meilleure solution de contournement ou d'amélioration?

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

Merci pour vos commentaires

44
EKI

Votre suggestion fonctionnerait, mais l'utilisation d'une boucle Do pourrait être un peu plus lisible.

Il s'agit en fait d'un idiome en C - au lieu d'utiliser un goto, vous pouvez avoir une boucle do {} while (0) avec une instruction break si vous voulez sortir rapidement de la construction.

Dim i

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

Comme l'écrase le suggère, cela semble un peu mieux si vous supprimez le niveau d'indentation supplémentaire.

Dim i

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

Une solution sur laquelle j'ai décidé impliquait l'utilisation d'une variable booléenne pour suivre si la boucle for devait traiter ses instructions ou passer à l'itération suivante:

Dim continue

For Each item In collection
    continue = True

    If condition1 Then continue = False End If

    If continue Then
        'Do work
    End If
Next

J'ai trouvé que les solutions de boucles imbriquées étaient quelque peu déroutantes en termes de lisibilité. Cette méthode a également ses propres pièges car la boucle ne passe pas immédiatement à l'itération suivante après avoir rencontré continue. Il serait possible pour une condition ultérieure d'inverser l'état de continue. Il a également une construction secondaire dans la boucle initiale et nécessite la déclaration d'une variable supplémentaire.

Oh, VBScript ... soupir.

De plus, si vous souhaitez utiliser la réponse acceptée, qui n'est pas trop mauvaise en termes de lisibilité, vous pouvez coupler cela avec l'utilisation de : pour fusionner les deux boucles en ce qui semble en être une:

Dim i

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

J'ai trouvé utile d'éliminer le niveau supplémentaire d'indentation.

7
crush

Une option serait de mettre tout le code dans la boucle à l'intérieur d'un Sub et de revenir ensuite de ce Sub quand vous voulez "continuer".

Pas parfait, mais je pense que ce serait moins déroutant que la boucle supplémentaire.

Edit: Ou je suppose que si vous êtes assez courageux, vous pouvez utiliser un Goto pour sauter au début de la boucle d'une certaine manière (en vous assurant que le compteur est correctement mis à jour), je pense que VBScript le supporte, mais votre réputation pourrait en souffrir si quelqu'un découvre que vous utilisez Goto dans votre code :)

6
Hans Olsson

J'utilise beaucoup le Do, Loop mais j'ai commencé à utiliser un Sub ou une Function dont je pouvais sortir à la place. Cela me semblait plus propre. Si les variables dont vous avez besoin ne sont pas globales, vous devrez également les transmettre au 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

Implémentez l'itération en tant que fonction récursive.

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

Commencez par un appel à Itérer (1, N)

0
Captain Giraffe

Je pense que vous êtes censé contenir TOUTE VOTRE LOGIQUE sous votre instruction if. Fondamentalement:

' 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

Cela peut rendre le code un peu plus long, mais certaines personnes n'aiment pas break ou continue de toute façon.

0
bobobobo

Nous pouvons utiliser une fonction distincte pour effectuer un travail de déclaration continue. supposons que vous ayez le problème suivant:

for i=1 to 10

if(condition) then   'for loop body'
contionue
End If

Next

Ici, nous allons utiliser un appel de fonction pour le corps de la boucle:

for i=1 to 10
Call loopbody()
next

function loopbody()

if(condition) then   'for loop body'
Exit Function
End If

End Function

la boucle continuera pour l'instruction de sortie de fonction ....

0
Ravi Likhar

Essayez d'utiliser les instructions While/Wend et 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
Máťa - Stitod.cz