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
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
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.
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 :)
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
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)
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.
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 ....
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