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?

28
demandé sur Max 2013-12-03 17:55:22

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!

45
répondu Polynomial 2017-01-28 19:15:57

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.

15
répondu Kul-Tigin 2013-12-03 14:23:11

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.

13
répondu MC ND 2017-05-23 11:47:01

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

1
répondu Deneb 2017-05-04 12:49:50

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.

1
répondu montonero 2018-01-12 11:29:42