如何在 VBScript for Classic-ASP 中执行单行 If 语句?

Posted

技术标签:

【中文标题】如何在 VBScript for Classic-ASP 中执行单行 If 语句?【英文标题】:How to do a single line If statement in VBScript for Classic-ASP? 【发布时间】:2013-12-19 14:57:55 【问题描述】:

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

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

有谁知道VBScript中是否有,确切的语法是什么?

【问题讨论】:

看起来它可能没有内置到语言中,看看这个:4guysfromrolla.com/webtech/tips/t041301-1.shtml 编辑 - 这看起来实际上是更好的信息 - support.microsoft.com/kb/219271 【参考方案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 必须是该行中唯一的语句。

对此没有错误检查,并且该函数需要一个格式良好的表达式,该表达式可以评估为作为子句传入的布尔值。有关更复杂和全面的答案,请参见下文。不过,希望这个简单的回答能够巧妙地展示答案背后的逻辑。

还值得注意的是,与真正的三元运算符不同,sTruesFalse 参数都将被计算,而不管 bClause 的值是多少。如果您将它与问题中的字符串一起使用,这很好,但如果您将函数作为第二个和第三个参数传入,请非常小心!

【讨论】:

我无法想象为什么有人会以这种方式使代码复杂化.. 我无法想象为什么会创建 VBScript【参考方案2】:

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

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

顺便说一句,如果三元运算符对您来说非常重要,您可以在 Classic ASP 中使用 JScript。

【讨论】:

【参考方案3】:

编辑 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 

If 使用Cbool 函数尝试将传递的Expression 参数转换为布尔值,并接受TrueValueFalseValue 参数中的任何类型的值。对于一般用途,这是快速、安全且完全符合记录的 VBScript 行为。

此代码的唯一“问题”CBool 的行为对于某些数据类型并不完全“直观”,至少对于那些我们在 vbscript 和 javascript 之间不断变化。虽然数值是一致的(0False,任何其他数值都是 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 

但与使用的版本无关,请注意,您正在调用一个函数,而不是使用三元运算符。您在 FalsePart 的 TruePart 中放入的任何代码或函数调用都将独立于条件值执行。所以这段代码

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()

【讨论】:

【参考方案5】:

对于精确的单行,可能有一个奇怪的技巧(嗨,Python!):

lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))

“魔法”之所以起作用,是因为 VBScript 中的布尔运算特性。 True 实际上是 -1 而 False 是 0,因此我们可以将它用作数组的索引(只需去掉一个减号)。那么数组的第一项将是 False 条件的值,第二项是 True。

【讨论】:

以上是关于如何在 VBScript for Classic-ASP 中执行单行 If 语句?的主要内容,如果未能解决你的问题,请参考以下文章

vbscript Iterar registros de una consulta SELECT en ASP CLASSIC

更新 Excel 工作表(在经典 ASP/Vbscript 中)

使用 Classic ASP/ 创建服务器端 REST API 时遇到问题/

安装软件出现 could not access vbscript run time for custom action 错误

5 Classic Running Routes For Spring Training

vbscript 添加Space for Equ