15

私は維持しなければならない大規模なクラシックASPアプリを持っていますが、短絡評価機能の欠如に何度も悩まされています。たとえば、VBScriptでは次のことを回避できません。

if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...

... Rs( "myField")がnullの場合、2番目の条件でnullを0と比較してエラーが発生するため、通常は代わりにこれを実行することになります。

dim myField
if isNull(Rs("myField")) then 
    myField = 0
else
    myField = Rs("myField")
end if

if myField <> 0 then
...

明らかに、冗長性はかなりぞっとします。この大規模なコードベースを見てみると、私が見つけた最善の回避策は、元のプログラマーが書いたTernaryOpと呼ばれる関数を使用することです。これは、基本的に三項演算子のような機能を移植しますが、それでも一時変数を使用し続けます。よりフル機能の言語で必要です。もっと良い方法はありますか?短絡が実際にVBScriptに存在するいくつかの極秘の方法?

4

9 に答える 9

10

ネストされたIF(少しだけ冗長ではありません):

if not isNull(Rs("myField")) Then
   if Rs("myField") <> 0 then
于 2008-09-12T17:45:12.770 に答える
7

最善の方法ではないかもしれませんが、確かに機能します...また、vb6または.netを使用している場合は、適切なタイプにキャストするさまざまなメソッドを使用することもできます。

if cint( getVal( rs("blah"), "" ) )<> 0 then
  'do something
end if


function getVal( v, replacementVal )
  if v is nothing then
    getVal = replacementVal
  else
    getVal = v
  end if
end function
于 2008-09-12T17:50:44.553 に答える
5

私は常に Select Case ステートメントを使用して、VB のロジックを短絡させていました。何かのようなもの..

Select Case True

Case isNull(Rs("myField"))

    myField = 0

Case (Rs("myField") <> 0)

    myField = Rs("myField")

Case Else

    myField = -1        

End Select

しばらくの間、私の構文がオフになっている可能性があります。最初のケースがポップした場合、他のすべては無視されます。

于 2008-09-12T18:26:33.780 に答える
3

あるいは、質問の最後が間違っていたのかもしれません。iIf()VBのようなものを意味しましたか?これは私のために働く:

myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))

wherereturnIf()は次のような関数です:

function returnIf(uExpression, uTrue, uFalse)
    if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
于 2008-09-26T13:42:35.917 に答える
1

ええ、それは最善の解決策ではありませんが、私たちが使用しているのはこのようなものです

function ReplaceNull(s)
    if IsNull(s) or s = "" then
        ReplaceNull = "&nbsp;"
    else
        ReplaceNull = s
    end if
end function
于 2008-09-12T17:58:59.867 に答える
0

私の友人、TernaryOpがあなたの唯一の希望です。

于 2008-09-12T17:49:35.677 に答える
0

2つのオプションが思い浮かびます。

1)またはを使用して、変数にデータがあるかどうlen()かを検出します。lenb()

if not lenb(rs("myField"))=0 then...

2)ブール値を返す関数を使用します。

if not isNothing(rs("myField")) then...

isNothing()このような関数はどこにありますか?

function isNothing(vInput)
    isNothing = false : vInput = trim(vInput)
    if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if 
end function
于 2008-09-26T13:36:34.853 に答える