Как сделать одиночную строку Если оператор в VBScript для Classic-ASP?
"Операция с одной строкой if" существует в С# и VB.NET, как и во многих других языках программирования и script в следующем формате
lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";
Кто-нибудь знает, есть ли даже в VBScript и какой синтаксис extact?
Ответы
Ответ 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()