VBScript conditional short-circuiting workaround

倾然丶 夕夏残阳落幕 提交于 2019-12-05 12:51:10

问题


I have a large classic ASP app that I have to maintain, and I repeatedly find myself thwarted by the lack of short-circuit evaluation capability. E.g., VBScript won't let you get away with:

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

...because if Rs("myField") is null, you get an error in the second condition, comparing null to 0. So I'll typically end up doing this instead:

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

if myField <> 0 then
...

Obviously, the verboseness is pretty appalling. Looking around this large code base, the best workaround I've found is to use a function the original programmer wrote, called TernaryOp, which basically grafts in ternary operator-like functionality, but I'm still stuck using a temporary variable that would not be necessary in a more full-featured language. Is there a better way? Some super-secret way that short-circuiting really does exist in VBScript?


回答1:


Maybe not the best way, but it certainly works... Also, if you are in vb6 or .net, you can have different methods that cast to proper type too.

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



回答2:


Nested IFs (only slightly less verbose):

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



回答3:


I always used Select Case statements to short circuit logic in VB. Something like..

Select Case True

Case isNull(Rs("myField"))

    myField = 0

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

    myField = Rs("myField")

Case Else

    myField = -1        

End Select

My syntax may be off, been a while. If the first case pops, everything else is ignored.




回答4:


Or perhaps I got the wrong end of the question. Did you mean something like iIf() in VB? This works for me:

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

where returnIf() is a function like so:

function returnIf(uExpression, uTrue, uFalse)
    if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function



回答5:


If you write it as two inline IF statements, you can achieve short-circuiting:

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

But your then action must appear on the same line as well. If you need multiple statements after then, you can separate them with : or move your code to a subroutine that you can call. For example:

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2

Or

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



回答6:


Would that there were, my friend -- TernaryOp is your only hope.




回答7:


Yeah it's not the best solution but what we use is something like this

function ReplaceNull(s)
    if IsNull(s) or s = "" then
        ReplaceNull = "&nbsp;"
    else
        ReplaceNull = s
    end if
end function



回答8:


Two options come to mind:

1) use len() or lenb() to discover if there is any data in the variable:

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

2) use a function that returns a boolean:

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

where isNothing() is a function like so:

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



回答9:


You may be able to just use Else to catch nulls, ""s, etc.

If UCase(Rs("myField")) = "THING" then
  'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
  'Do Other Stuff
else
  'Invalid data, such as a NULL, "", etc.
  'Throw an error, do nothing, or default action
End If

I've tested this in my code and it's currently working. Might not be right for everyone's situation though.



来源:https://stackoverflow.com/questions/59599/vbscript-conditional-short-circuiting-workaround

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!