Как сделать одну строку оператора If в VBScript для Classic-ASP?

оператор "single line if" существует в C# и VB.NET как и во многих других языках программирования и скриптов в следующем формате

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

кто-нибудь знает, есть ли даже в VBScript и каков синтаксис extact?

5 ответов


условный тернарный оператор не существует вне коробки, но довольно легко создать свою собственную версию в VBScript:

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

затем вы можете использовать это, как в вашем примере:

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

преимущество этого над использованием одной строки If/Then/Else заключается в том, что он может быть непосредственно объединен с другими строками. Используя If/Then/Else в одной строке должен быть единственный оператор в этой строке.

ошибки нет проверяя это, функция ожидает хорошо сформированное выражение, которое может быть оценено в логическое значение, переданное как предложение. Более сложный и исчерпывающий ответ см. ниже. Надеюсь, этот простой ответ аккуратно демонстрирует логику ответа.

также стоит отметить, что в отличие от реального тернарного оператора,и sTrue и sFalse параметры будут оцениваться независимо от значения bClause. Это нормально, если вы используете его со строками как в вопросе, но будьте очень осторожны, если вы передаете функции как второй и третий параметры!


VBScript не имеет троичного оператора.
Закрыть решение в одной строке и без использования определяемой пользователем функции, чистый VBScript:

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

кстати, вы можете использовать JScript в классическом ASP, если троичный опер так важен для вас.


редактировать 2017/01/28 для адаптации к некоторым аргументам не булевых условий

Примечание: если все, что вам нужно, это выбрать строку на основе логическое значение, пожалуйста, используйте код в Полиноминальная по ответ. Это проще и быстрее, чем код в этом ответе.

для простого, но более "гибкий" решение, этот код (исходный код в этом ответе) должен обрабатывать обычный базовый сценарии

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 

если используется Cbool функция, чтобы попытаться преобразовать пройденный Expression аргумент для логического и принимает любой тип значения в TrueValue и FalseValue аргументов. Для общего использования это быстро, безопасно и полностью соответствует документированному поведению VBScript.

только "проблемы" С этим кодом является то, что поведение CBool не полностью "интуитивный" для некоторых типов данных, по крайней мере для тех из нас, что постоянно меняется между vbscript и javascript. В то время как числовые значения когерентны (a 0 это False и любое другое числовое значение True), не числовые типы генерируют ошибку времени выполнения (в предыдущем коде обрабатывается как false), за исключением, если это строка с числовым содержимым или которая может быть интерпретирована как true или false значение на английском языке или в языковом стандарте ОС.

если вы нужно это, версия VBScript "эквивалент" до ? в JavaScript тернарный оператор

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 

но независимо от используемой версии, будьте осторожны, вы вызываете функцию, не используя тернарный оператор. Любой код или вызов функции, помещенный в TruePart FalsePart, будет выполняться независимо от значения условия. Итак, этот код

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

выполнит две функции. Только правильное значение будет возвращено в value var.


связанный с @MC_ND ответ:

выполнять только одну функцию, вы можете сделать что-то вроде этого:

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

то же самое для FalsePart, и вызовите IIf () это так:

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

и вызовет DoSomething () или DontDoSomething ()


возможен странный трюк (привет, Python!) для точного однострочного:

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

"магия" работает из-за специфики булевой операции в VBScript. правда на самом деле -1 и False равно 0, поэтому мы можем использовать его как индекс для массива (просто избавимся от минуса). Тогда первым элементом массива будет значение False condition, а вторым - True.