web-dev-qa-db-fra.com

Comment faire une seule instruction Si dans VBScript pour Classic-ASP?

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?

29
Max

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!

47
Polynomial

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.

16
Kul-Tigin

_ {é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.

13
MC ND

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.

2
montonero

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 ()

1
Deneb