Как сделать одну строку оператора 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.