Подтвердить что ты не робот

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

"Операция с одной строкой if" существует в С# и VB.NET, как и во многих других языках программирования и script в следующем формате

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

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

4b9b3361

Ответ 1

Условный тернарный оператор не существует из коробки, но довольно легко создать свою собственную версию в 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. Это нормально, если вы используете его со строками, как в вопросе, но будьте очень осторожны, если вы передадите функции в качестве второго и третьего параметров!

Ответ 2

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

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

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

Ответ 3

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

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

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

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 в boolean и принять любой тип значения в аргументах TrueValue и FalseValue. Для общего использования это быстро, безопасно и полностью соответствует документированному поведению VBScript.

Единственная "проблема" с этим кодом заключается в том, что поведение Cbool не является полностью "интуитивным" для некоторых типов данных, по крайней мере для тех из нас, которые постоянно меняются между vbscript и javascript. Хотя числовые значения являются когерентными (a 0 - это 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.

Ответ 4

связанный с ответом @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()