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
の値に関係なく評価されますであることにも注意してください。質問のように文字列で使用する場合はこれで問題ありませんが、2番目と3番目のパラメーターとして関数を渡す場合は非常に注意してください!
VBScriptには三項演算子はありません。
1行で、ユーザー定義関数を使用しない純粋なVBScriptの厳密なソリューション:
If dayOfTheWeek = "Tuesday" Then lunchLocation = "Fuddruckers" Else lunchLocation = "Food Court"
ところで、Classic ASPで三項演算子が非常に重要な場合は、JScriptを使用できます。
編集済み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の間で絶えず変化するデータ型の場合。数値は一貫しています(_0
はFalse
であり、他の数値は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に返されます。
正確なワンライナーには奇妙なトリックが可能です(こんにちは、Python!):
lunchLocation = array("Food Court", "Fuddruckers")(-(dayOfTheWeek = "Tuesday"))
「魔法」は、VBScriptのブール演算の詳細のために機能します。 Trueは実際には-1であり、Falseは0であるため、配列のインデックスとして使用できます(マイナスを取り除くだけです)。次に、配列の最初の項目はFalse条件の値になり、2番目の項目はTrueになります。
@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()を呼び出します