C#和VB.NET中存在“单行if语句”,与以下格式的许多其他编程和脚本语言一样
lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";
有没有人知道甚至在VBScript中是否存在什么是确切的语法?
条件三元运算符不是开箱即用的,但在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"
顺便说一句,如果三元运算符对您如此重要,您可以在Classic ASP中使用JScript。
编辑2017/01/28以适应一些非布尔条件参数
注意:如果您只需要根据布尔值选择字符串,请使用Polinominal的answer中的代码。它比本答案中的代码更简单,更快捷。
对于一个简单但更“灵活”的解决方案,此代码(本答案中的原始代码)应该处理通常的基本方案
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之间不断变化的人来说。虽然数值是连贯的(0
是False
,而任何其他数值是True
),非数字类型会生成运行时错误(在以前的代码中处理为false),除非它是带有数字内容的字符串或者可以是在英语或OS语言环境中解释为true或false值。
如果你需要它,与?
javascript三元运算符“等价”的VBScript版本是
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
但是,与所使用的版本无关,请注意,您正在调用函数,而不是使用三元运算符。您在FalsePart的TruePart中放入的任何代码或函数调用都将独立于条件的值执行。所以这段代码
value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )
WILL执行这两个功能。只有正确的值才会返回value
var。
对于精确的单线程,可能有一个奇怪的技巧(嗨,Python!):
lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
由于VBScript中的布尔操作细节,“魔术”起作用。 True实际上是-1而False是0,因此我们可以将它用作数组的索引(只是去掉一个减号)。然后,数组的第一项将是False条件的值,第二项是True。
与@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()