Pergunta

Tenho um grande aplicativo ASP clássico que preciso manter e fico repetidamente frustrado pela falta de capacidade de avaliação de curto-circuito.Por exemplo, o VBScript não permitirá que você se livre de:

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

... porque se Rs("myField") for nulo, você receberá um erro na segunda condição, comparando nulo com 0.Então, normalmente acabo fazendo isso:

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

if myField <> 0 then
...

Obviamente, a verbosidade é bastante terrível.Olhando em torno desta grande base de código, a melhor solução que encontrei é usar uma função que o programador original escreveu, chamada TernaryOp, que basicamente enxerta uma funcionalidade semelhante a um operador ternário, mas ainda estou preso usando uma variável temporária que não funcionaria. ser necessário em uma linguagem mais completa.Existe uma maneira melhor?Alguma maneira supersecreta de que o curto-circuito realmente exista no VBScript?

Foi útil?

Solução

Talvez não seja a melhor maneira, mas certamente funciona...Além disso, se você estiver em vb6 ou .net, poderá ter métodos diferentes que também são convertidos para o tipo adequado.

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

Outras dicas

IFs aninhados (apenas um pouco menos detalhados):

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

Eu sempre usei instruções Select Case para curto-circuitar a lógica em VB.Algo como..

Select Case True

Case isNull(Rs("myField"))

    myField = 0

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

    myField = Rs("myField")

Case Else

    myField = -1        

End Select

Minha sintaxe pode estar errada, já faz um tempo.Se o primeiro caso aparecer, todo o resto será ignorado.

Ou talvez eu tenha entendido errado a pergunta.Você quis dizer algo como iIf() em VB?Isso funciona para mim:

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

onde returnIf() é uma função assim:

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

Se você escrever como dois inline IF declarações, você pode causar curto-circuito:

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

Mas o seu then action também deve aparecer na mesma linha.Se você precisar de várias instruções depois then, você pode separá-los com : ou mova seu código para uma sub-rotina que você possa chamar.Por exemplo:

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

Ou

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

Se houvesse, meu amigo - TernaryOp é sua única esperança.

Sim, não é a melhor solução, mas o que usamos é algo assim

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

Duas opções vêm à mente:

1) usar len() ou lenb() para descobrir se há algum dado na variável:

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

2) use uma função que retorne um booleano:

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

onde isNothing() é uma função assim:

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

Você pode apenas usar Else para capturar nulos, ""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

Eu testei isso no meu código e atualmente está funcionando.Pode não ser adequado para a situação de todos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top