L'instruction "ligne unique si" existe dans C # et VB.NET, comme dans de nombreux autres langages de programmation et de script, au 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 d'extact?
L'opérateur ternaire conditionnel n'existe pas dans la boîte, mais il est assez facile de créer votre propre version dans VBScript:
Function IIf(bClause, sTrue, sFalse)
If CBool(bClause) Then
IIf = sTrue
Else
IIf = sFalse
End If
End Function
Vous pouvez ensuite utiliser ceci, selon votre exemple:
lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")
L’avantage de cela par rapport à l’utilisation d’une seule ligne If
/Then
/Else
est qu’elle peut être directement concaténée avec d’autres chaînes. L'utilisation de If
/Then
/Else
sur une seule ligne doit être la seule instruction sur cette ligne.
Il n'y a pas d'erreur de vérification à ce sujet et la fonction s'attend à une expression bien formée pouvant être évaluée à un booléen transmis en tant que clause. Pour une réponse plus compliquée et complète, voir ci-dessous. Espérons que cette réponse simple démontre clairement la logique derrière la réponse cependant.
Il convient également de noter que, contrairement à un véritable opérateur ternaire, les paramètres sTrue
et sFalse
seront évalués indépendamment de la valeur de bClause
. Cela convient si vous l'utilisez avec des chaînes comme dans la question, mais soyez très prudent si vous transmettez des fonctions en tant que 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"
En passant, vous pouvez utiliser JScript dans Classic ASP si l’opérateur ternaire est si important pour vous.
_ {édité 2017/01/28 pour s'adapter à certains des arguments de condition non booléens
Note: Si tout ce dont vous avez besoin est de sélectionner une chaîne basée sur une valeur booléenne, utilisez le code contenu dans le answer du Polinominal. C'est plus simple et plus rapide que le code de cette réponse.
Pour une solution simple mais plus "flexible", ce code (le code original dans cette réponse) doit gérer les scénarios de base habituels
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 la fonction Cbool
pour tenter de convertir l'argument Expression
passé en un booléen, et accepte tout type de valeur dans les arguments TrueValue
et FalseValue
. Pour une utilisation générale, il est rapide, sûr et conforme au comportement documenté de VBScript.
Le seul "problème" avec ce code est que le comportement de CBool
n'est pas totalement "intuitif" pour certains types de données, du moins pour ceux d'entre nous qui changent constamment entre vbscript et javascript. Alors que les valeurs numériques sont cohérentes (un 0
est une False
et toute autre valeur numérique est une True
), les types non numériques génèrent une erreur d'exécution (dans le code précédent traité comme faux), sauf s'il s'agit d'une chaîne avec un contenu numérique ou pouvant être interprété comme une valeur true ou false en anglais ou dans les paramètres régionaux du système d'exploitation.
Si vous devezil, une version VBScript "équivalente" à l'opérateur ?
javascript ternary 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 quelle que soit la version utilisée, soyez prudent, vous appelez une fonction sans utiliser d'opérateur ternaire. Tout code ou appel de fonction que vous avez mis dans la TruePart de FalsePart SERA EXÉCUTÉ indépendamment de la valeur de la condition. Donc ce code
value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )
SERA EXECUTER les deux fonctions. Seule la valeur correcte sera renvoyée à value
var.
Il y a un truc étrange possible (bonjour, Python!) Pour un one-liner:
lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
La "magie" fonctionne à cause d'une opération booléenne dans VBScript. True est en fait -1 et False est 0, nous pouvons donc l'utiliser comme index pour array (il suffit de supprimer un moins) Ensuite, le premier élément du tableau sera une valeur pour la condition False et le second élément pour la valeur True.
lié à @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
idem pour FalsePart, et appelez IIf () comme ça:
value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )
et appellera DoSomething () ou DontDoSomething ()