wake-up-neo.net

Wie mache ich eine einzeilige If-Anweisung in VBScript für Classic-ASP?

Die "Einzeilige if-Anweisung" existiert in C # und VB.NET wie in vielen anderen Programmier- und Skriptsprachen im folgenden Format

lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";

weiß jemand, ob es überhaupt VBScript gibt und wie die genaue Syntax ist?

29
Max

Der bedingte ternäre Operator ist nicht standardmäßig vorhanden, aber es ist ziemlich einfach, eine eigene Version in VBScript zu erstellen:

Function IIf(bClause, sTrue, sFalse)
    If CBool(bClause) Then
        IIf = sTrue
    Else 
        IIf = sFalse
    End If
End Function

Sie können dies wie in Ihrem Beispiel verwenden:

lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")

Der Vorteil gegenüber der Verwendung einer einzelnen Zeile IfThen/Else BESTEHT DARIN, DASS SIE DIREKT MIT ANDEREN ZEICHENFOLGEN VERKETTET WERDEN KANN. DIE If/Then/Else IN EINER EINZELNEN ZEILE MUSS DIE EINZIGE ANWEISUNG IN DIESER ZEILE SEIN.

ES GIBT KEINE FEHLERPRÜFUNG, UND DIE FUNKTION ERWARTET EINEN WOHLGEFORMTEN AUSDRUCK, DER ZU EINEM BOOLESCHEN WERT AUSGEWERTET WERDEN KANN, DER ALS KLAUSEL ÜBERGEBEN WIRD. FÜR EINE KOMPLIZIERTERE UND UMFASSENDERE ANTWORT SIEHE UNTEN. HOFFENTLICH DEMONSTRIERT DIESE EINFACHE ANTWORT DIE LOGIK HINTER DER ANTWORT.

ES IST AUCH ERWÄHNENSWERT, DASS IM GEGENSATZ ZU EINEM ECHTEN TERNÄREN OPERATOR _/SOWOHL DIE PARAMETER sTrue ALS AUCH sFalse UNABHÄNGIG VOM WERT VON bClause ausgewertet werden. Dies ist in Ordnung, wenn Sie es wie in der Frage mit Strings verwenden, aber seien Sie vorsichtig, wenn Sie Funktionen als zweiten und dritten Parameter übergeben.

47
Polynomial

VBScript hat keinen ternären Operator.
Eine enge Lösung in einer einzelnen Zeile und ohne Verwendung einer benutzerdefinierten Funktion, reines VBScript:

If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"

Übrigens, Sie können JScript in Classic ASP verwenden, wenn der ternäre Operator so wichtig für Sie ist.

16
Kul-Tigin

bearbeitet 28.01.2017, um sich an einige der nicht-booleschen Bedingungsargumente anzupassen

Hinweis : Wenn Sie lediglich eine Zeichenfolge basierend auf einem Booleschen Wert auswählen müssen, verwenden Sie bitte den Code im Polinominal answer . Es ist einfacher und schneller als der Code in dieser Antwort.

Für eine einfache, aber mehr "flexible" Lösung sollte dieser Code (der ursprüngliche Code in dieser Antwort) die üblichen Grundszenarien handhaben

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 

Verwendet die Funktion Cbool, um zu versuchen, das übergebene Argument Expression in einen Booleschen Wert zu konvertieren, und akzeptiert alle Arten von Werten in den Argumenten TrueValue und FalseValue. Für den allgemeinen Gebrauch ist dies schnell, sicher und entspricht vollständig dem dokumentierten VBScript-Verhalten.

Das einzige "Problem" mit diesem Code ist, dass das Verhalten des CBool nicht vollständig "intuitiv" ist Einige Datentypen, zumindest für diejenigen von uns, die ständig zwischen vbscript und Javascript wechseln. Während numerische Werte kohärent sind (ein 0 ist ein False und jeder andere numerische Wert ist ein True), erzeugen nicht numerische Typen einen Laufzeitfehler (im vorherigen Code als falsch behandelt), außer Wenn es sich um eine Zeichenfolge mit numerischem Inhalt handelt oder die als wahrer oder falscher Wert in Englisch oder im Gebietsschema des Betriebssystems interpretiert werden kann.

Wenn Sie es benötigen , ist eine VBScript-Version "äquivalent" zum JavaScript-Ternär ? Betreiber ist

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 

ABER unabhängig von der verwendeten Version, seien Sie vorsichtig, Sie rufen eine Funktion auf und verwenden keinen ternären Operator . Jeder Code oder Funktionsaufruf, den Sie in TruePart oder FalsePart eingeben, wird unabhängig vom Wert der Bedingung ausgeführt. Also dieser Code

value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )

WIRD die beiden Funktionen ausführen. Nur der richtige Wert wird an value var zurückgegeben.

13
MC ND

Es gibt einen seltsamen Trick (hallo, Python!) Für genaues Einzeiler:

lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))

Die "Magie" funktioniert aufgrund einer booleschen Operation in VBScript. True ist eigentlich -1 und False ist 0, daher können wir ihn als Index für Array verwenden (einfach ein Minus loswerden). Das erste Element des Arrays ist dann ein Wert für die Bedingung "False" und das zweite Element für "True".

2
montonero

@MC_ND Antwort:

um nur eine Funktion auszuführen, können Sie so etwas tun:

If VarType(TruePart) = vbString and InStr(1,TruePart,"function:") = 1 then
  IIf = GetRef(Mid(TruePart,10))()
Else
  IIf = TruePart
End If

dasselbe gilt für den FalsePart, und nennen Sie IIf () so:

value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )

und ruft DoSomething () oder DontDoSomething () auf

1
Deneb