web-dev-qa-db-ja.com

Classic-ASPのVBScriptで単一行のIfステートメントを実行する方法は?

C#およびVB.NETには、他の多くのプログラミング言語およびスクリプト言語と同様に、次の形式の「単一行ifステートメント」が存在します。

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

vBScriptにさえ存在するかどうか、そして厳密な構文は何かを知っていますか?

31
Max

条件付き三項演算子はすぐに使用できるわけではありませんが、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の値に関係なく評価されますであることにも注意してください。質問のように文字列で使用する場合はこれで問題ありませんが、2番目と3番目のパラメーターとして関数を渡す場合は非常に注意してください!

49
Polynomial

VBScriptには三項演算子はありません。
1行で、ユーザー定義関数を使用しない純粋なVBScriptの厳密なソリューション:

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

ところで、Classic ASPで三項演算子が非常に重要な場合は、JScriptを使用できます。

18
Kul-Tigin

編集済み2017/01/28、非ブール条件引数の一部に適応

:ブール値に基づいて文字列を選択するだけでよい場合は、ポリノミナールの 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の間で絶えず変化するデータ型の場合。数値は一貫しています(_0Falseであり、他の数値はTrueです)、数値以外のタイプはランタイムエラーを生成します(以前のコードではfalseとして処理されます)。または、英語またはOSロケールで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() )

2つの機能を実行します。正しい値のみがvalue varに返されます。

13
MC ND

正確なワンライナーには奇妙なトリックが可能です(こんにちは、Python!):

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

「魔法」は、VBScriptのブール演算の詳細のために機能します。 Trueは実際には-1であり、Falseは0であるため、配列のインデックスとして使用できます(マイナスを取り除くだけです)。次に、配列の最初の項目はFalse条件の値になり、2番目の項目はTrueになります。

3
montonero

@MC_ND回答に関連:

1つの関数のみを実行するには、次のようなことができます。

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()を呼び出します

1
Deneb