If statement 如何在经典ASP的VBScript中执行单行If语句?

If statement 如何在经典ASP的VBScript中执行单行If语句?,if-statement,syntax,vbscript,asp-classic,If Statement,Syntax,Vbscript,Asp Classic,与许多其他编程和脚本语言一样,C#和VB.NET中也存在“单行if语句”,格式如下 lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court"; 是否有人知道VBScript中是否有,extact语法是什么?条件三元运算符不存在,但在VBScript中创建自己的版本非常容易: Function IIf(bClause, sTrue, sFalse) If CBool(bClause) Then

与许多其他编程和脚本语言一样,C#和VB.NET中也存在“单行if语句”,格式如下

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

是否有人知道VBScript中是否有,extact语法是什么?

条件三元运算符不存在,但在VBScript中创建自己的版本非常容易:

Function IIf(bClause, sTrue, sFalse)
    If CBool(bClause) Then
        IIf = sTrue
    Else 
        IIf = sFalse
    End If
End Function
If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"
然后,您可以按照您的示例使用此选项:

lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")
与使用单行
If
/
Then
/
Else
相比,这种方法的优点是它可以直接与其他字符串连接。如果在一行中使用
,则必须在该行中使用唯一语句

对此没有错误检查,函数需要一个格式良好的表达式,该表达式的计算结果可以是作为子句传入的布尔值。有关更复杂和全面的答案,请参见下文。希望这个简单的回答清楚地说明了答案背后的逻辑


还值得注意的是,与真正的三元运算符不同,无论
bClause
的值如何,都将对
sTrue
sFalse
参数进行评估。如果您将其与问题中的字符串一起使用,这是很好的,但是如果您将函数作为第二个和第三个参数传入,请非常小心

VBScript没有任何三元运算符。
一行中的封闭解决方案,不使用用户定义的函数,纯VBScript:

Function IIf(bClause, sTrue, sFalse)
    If CBool(bClause) Then
        IIf = sTrue
    Else 
        IIf = sFalse
    End If
End Function
If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"

顺便说一句,如果三元运算符对您如此重要,您可以在经典ASP中使用JScript。

编辑了2017/01/28以适应一些非布尔条件参数

注意:如果您只需要根据布尔值选择字符串,请使用Polinominal中的代码。它比这个答案中的代码更简单、更快

对于一个简单但更“灵活”的解决方案,此代码(此答案中的原始代码)应处理通常的基本场景

函数IIf(表达式、TruePart、FalsePart)
模糊表达
beexpression=False
出错时继续下一步
bExpression=CBool(表达式)
错误转到0
如果是表达式,那么
如果是IsObject(TruePart),则
设置IIf=TruePart
其他的
IIf=TruePart
如果结束
其他的
如果是IsObject(FalsePart),则
设置IIf=假零件
其他的
IIf=假零件
如果结束
如果结束
端函数
If使用
Cbool
函数尝试将传递的
表达式
参数转换为布尔值,并接受
TrueValue
false值
参数中的任何类型的值。对于一般用途,这是快速、安全的,并且完全符合已记录的VBScript行为

这段代码唯一的“问题”是,对于某些数据类型,
CBool
的行为并不完全“直观”,至少对于我们这些在vbscript和javascript之间不断变化的人来说是如此。虽然数值是一致的(a
0
是一个
False
,任何其他数值都是一个
True
),但非数值类型会生成运行时错误(在以前的代码中被处理为False),除非它是一个包含数值内容的字符串,或者在英语或操作系统语言环境中可以解释为True或False值

如果您需要它,则需要一个与
javascript三元运算符“等效”的VBScript版本

函数IIf(表达式、TruePart、FalsePart)
Dim vType,beexpression
vType=VarType(表达式)
选择案例vType
Case vbBoolean:bExpression=Expression
大小写vbString:bExpression=Len(表达式)>0
案例vbEmpty,vbNull,vbError:beexpression=False
Case vbObject:bExpression=Not(表达式为Nothing)
案例vbDate,vbDataObject:bExpression=True
其他情况
如果vType>8192,则
beexpression=True
其他的
beexpression=False
出错时继续下一步
bExpression=CBool(表达式)
错误转到0
如果结束
结束选择
如果是表达式,那么
如果是IsObject(TruePart),则
设置IIf=TruePart
其他的
IIf=TruePart
如果结束
其他的
如果是IsObject(FalsePart),则
设置IIf=假零件
其他的
IIf=假零件
如果结束
如果结束
端函数
但与使用的版本无关,请小心,您正在调用函数,而不是使用三元运算符。在FalsePart的TruePart中输入的任何代码或函数调用都将独立于条件值执行。所以这个代码

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

将执行这两个函数。只有正确的值才会返回到与@MC\u和answer相关的
value
var.

要仅执行一个函数,可以执行以下操作:

If VarType(TruePart) = vbString and InStr(1,TruePart,"function:") = 1 then
  IIf = GetRef(Mid(TruePart,10))()
Else
  IIf = TruePart
End If
value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )
FalsePart也是如此,并按如下方式调用IIf():

If VarType(TruePart) = vbString and InStr(1,TruePart,"function:") = 1 then
  IIf = GetRef(Mid(TruePart,10))()
Else
  IIf = TruePart
End If
value = IIf( 2 > 3 , "function:DoSomething", "function:DontDoSomething" )

并将调用DoSomething()或dontDomething()

对于一行代码,可能会有一个奇怪的技巧(嗨,Python!):

lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
由于VBScript中的布尔运算细节,“魔法”起作用。
True实际上是-1,False是0,因此我们可以将其用作数组的索引(只需去掉负号)。然后数组的第一项将是False条件的值,第二项将是True条件的值。

看起来它可能没有内置到语言中,看看这个:编辑-实际上这看起来像更好的信息-非常方便的“小心”注释。我想知道为什么我的脚本看起来有悖逻辑。我无法想象为什么有人会以这种方式将代码复杂化。。