Comment faire une ligne simple si l'instruction dans VBScript pour Classic-ASP?
l '"instruction if simple line" existe en C# et VB.NET comme dans beaucoup d'autres langages de programmation et de script dans le format suivant
lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";
est-ce que quelqu'un sait s'il y a même dans VBScript et quelle est la syntaxe extact?
5 réponses
l'opérateur ternaire conditionnel n'existe pas dans la boîte, mais il est assez facile de créer votre propre version en VBScript:
Function IIf(bClause, sTrue, sFalse)
If CBool(bClause) Then
IIf = sTrue
Else
IIf = sFalse
End If
End Function
vous pouvez alors utiliser ceci, comme dans votre exemple:
lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")
L'avantage de ce fil à l'aide d'une seule ligne If
/Then
/Else
est qu'il peut être directement concaténé avec d'autres chaînes. En utilisant If
/Then
/Else
sur une seule ligne doit être la seule instruction sur cette ligne.
Il n'y a pas d'erreur en vérifiant cela, et la fonction s'attend à une expression bien formée qui peut être évaluée à un booléen passé en tant que clause. Pour une réponse plus complexe et plus complète, voir ci-dessous. Espérons que cette réponse simple démontre clairement la logique derrière la réponse.
il est également intéressant de noter que contrairement à un opérateur ternaire réel,les deux sTrue
et sFalse
paramètres seront évalués indépendamment de la valeur de bClause
. C'est très bien si vous l'utilisez avec les chaînes comme dans la question, mais faites très attention si vous passez dans les fonctions comme deuxième et troisième paramètres!
VBScript n'a pas d'opérateur ternaire.
Une solution proche en une seule ligne et sans utiliser une fonction définie par l'utilisateur, VBScript pur:
If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"
BTW, vous pouvez utiliser JScript dans classic ASP si l'opérateur ternaire est si important pour vous.
modifié 2017/01/28 à s'adapter à certaines des non condition booléenne arguments
Remarque:: Si vous avez besoin de sélectionner une chaîne basée sur une valeur booléenne, s'il vous plaît, utilisez le code dans la Polinominal réponse. Il est plus simple et plus rapide que le code de cette réponse.
Pour un simple, mais plus "flexible" solution, ce code (le code original dans cette réponse) devrait traiter le code de base habituel les scénarios
Function IIf( Expression, TruePart, FalsePart)
Dim bExpression
bExpression = False
On Error Resume Next
bExpression = CBool( Expression )
On Error Goto 0
If bExpression Then
If IsObject(TruePart) Then
Set IIf = TruePart
Else
IIf = TruePart
End If
Else
If IsObject(FalsePart) Then
Set IIf = FalsePart
Else
IIf = FalsePart
End If
End If
End Function
si utilise le Cbool
fonction pour essayer de convertir le passé Expression
argument à un booléen, et accepte n'importe quel type de valeur dans le TrueValue
et FalseValue
arguments. Pour un usage général, c'est rapide, sûr et entièrement conforme au comportement documenté de VBScript.
le seul "problème" avec ce code est que le comportement du CBool
n'est pas entièrement "intuitive" pour certains types de données, au moins pour ceux d'entre nous qui change constamment entre vbscript et javascript. Alors que les valeurs numériques sont cohérents (un 0
est un False
et de toute autre valeur numérique est un True
), les types non numériques génèrent une erreur d'exécution (dans le code précédent traité comme false), sauf s'il s'agit d'une chaîne de caractères avec un contenu numérique ou qui peut être interprété comme true ou false valeur en anglais ou dans L'OS locale.
Si vous besoin it, une version VBScript "équivalent"?
javascript opérateur ternaire est
Function IIf( Expression, TruePart, FalsePart )
Dim vType, bExpression
vType = VarType( Expression )
Select Case vType
Case vbBoolean : bExpression = Expression
Case vbString : bExpression = Len( Expression ) > 0
Case vbEmpty, vbNull, vbError : bExpression = False
Case vbObject : bExpression = Not (Expression Is Nothing)
Case vbDate, vbDataObject : bExpression = True
Case Else
If vType > 8192 Then
bExpression = True
Else
bExpression = False
On Error Resume Next
bExpression = CBool( Expression )
On Error Goto 0
End If
End Select
If bExpression Then
If IsObject( TruePart ) Then
Set IIf = TruePart
Else
IIf = TruePart
End If
Else
If IsObject( FalsePart ) Then
Set IIf = FalsePart
Else
IIf = FalsePart
End If
End If
End Function
mais indépendamment de la version utilisée, faites attention, vous appelez une fonction, pas un opérateur ternaire. Tout appel de code, ou de fonction que vous mettez dans TruePart de FalsePart sera exécuté indépendamment de la valeur de la condition. Donc ce code
value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )
exécutera les deux fonctions. Seule la valeur correcte sera retournée à value
var.
en lien avec @MC_ND réponse:
pour exécuter une seule fonction, vous pouvez faire quelque chose comme ça:
If VarType(TruePart) = vbString and InStr(1,TruePart,"function:") = 1 then
IIf = GetRef(Mid(TruePart,10))()
Else
IIf = TruePart
End If
la même chose pour le FalsePart, et l'appeler IIf () comme ça:
value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )
et fera appel DoSomething() ou DontDoSomething()
Il y a un truc bizarre possible (Salut, Python!) pour une doublure exacte:
lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
la" magie " fonctionne à cause d'une opération booléenne spécifique dans VBScript. True est en fait -1 et False 0, on peut donc l'utiliser comme un indice de tableau (juste se débarrasser d'un signe moins). Alors le premier élément du tableau sera une valeur pour Faux état et le deuxième élément pour Vrai.