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

Max*_*Max 33 syntax vbscript if-statement asp-classic

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

lunchLocation = (dayOfTheWeek == "Tuesday") ? "Fuddruckers" : "Food Court";
Run Code Online (Sandbox Code Playgroud)

有没有人知道甚至在VBScript中有什么是extact语法?

Pol*_*ial 50

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

Function IIf(bClause, sTrue, sFalse)
    If CBool(bClause) Then
        IIf = sTrue
    Else 
        IIf = sFalse
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据您的示例使用此功能:

lunchLocation = IIf(dayOfTheWeek = "Tuesday", "Fuddruckers", "Food Court")
Run Code Online (Sandbox Code Playgroud)

这比使用单行If/ Then/ 的优点Else是它可以直接与其他字符串连接.在单行上使用If/ Then/ Else必须是该行上的唯一语句.

没有错误检查,函数需要一个格式良好的表达式,可以将其计算为作为子句传入的布尔值.有关更复杂和全面的答案,请参阅下文.希望这个简单的回答能够巧妙地展示答案背后的逻辑.

值得注意的是,与真正的三元运算符不同,无论值是多少,都将评估sTruesFalse参数bClause.如果您在问题中使用字符串,这很好,但如果您将函数作为第二个和第三个参数传递,请务必小心!

  • 我无法想象为什么要创建 VBScript (3认同)
  • 我无法想象如果某人如此讨厌该语言,为什么会在 VBScript 问题中发表评论。 (3认同)

Kul*_*gin 18

VBScript没有任何三元运算符.
单行中的紧密解决方案,不使用用户定义的函数,纯VBScript:

If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果三元opertor对你很重要,你可以在Classic ASP中使用JScript.


MC *_* ND 13

编辑 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 
Run Code Online (Sandbox Code Playgroud)

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

这段代码唯一的"问题"是某些数据类型的行为CBool并不完全"直观",至少对于那些在vbscript和javascript之间不断变化的人来说.虽然数值是连贯的(a 0是a,False而任何其他数值是a True),非数字类型会生成运行时错误(在以前的代码中处理为false),除非它是带有数字内容的字符串或可以解释为true英语或OS语言环境中的错误值.

如果需要,可以使用与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 
Run Code Online (Sandbox Code Playgroud)

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

value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )
Run Code Online (Sandbox Code Playgroud)

WILL执行这两个功能.只有正确的值才会返回到valuevar.

  • 非常方便"小心"注意.想知道为什么我的剧本看起来与逻辑相反. (8认同)

mon*_*ero 7

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

lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
Run Code Online (Sandbox Code Playgroud)

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