VBScript условное короткое замыкание обходной путь - PullRequest
14 голосов
/ 12 сентября 2008

У меня есть большое классическое приложение ASP, которое я должен поддерживать, и я неоднократно оказывался в затруднении из-за отсутствия возможности оценки короткого замыкания. Например, VBScript не позволит вам сойти с рук:

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

... потому что, если Rs ("myField") равен нулю, вы получаете ошибку во втором условии, сравнивая ноль с 0. Поэтому я обычно заканчиваю тем, что делаю это вместо:

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

if myField <> 0 then
...

Очевидно, что многословие довольно ужасно. Оглядываясь вокруг этой большой базы кода, я нашел лучший обходной путь - использовать функцию, написанную оригинальным программистом, под названием TernaryOp, которая в основном прививает тернарную функциональность, похожую на оператор, но я все еще застрял, используя временную переменную, которая не быть необходимым на более полнофункциональном языке. Есть ли способ лучше? Какой-то сверхсекретный способ, которым короткое замыкание действительно существует в VBScript?

Ответы [ 9 ]

9 голосов
/ 12 сентября 2008

Вложенные IF (только немного менее многословно):

if not isNull(Rs("myField")) Then
   if Rs("myField") <> 0 then
7 голосов
/ 12 сентября 2008

Может быть, не самый лучший способ, но он, безусловно, работает ... Кроме того, если вы работаете в 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
5 голосов
/ 12 сентября 2008

Я всегда использовал операторы 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

Мой синтаксис может быть отключен, давно. Если появляется первый случай, все остальное игнорируется.

3 голосов
/ 22 марта 2014

Если вы напишите это как два встроенных IF оператора, вы можете добиться короткого замыкания:

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

Но ваше действие then также должно появляться в одной строке. Если вам нужно несколько операторов после then, вы можете разделить их с помощью : или переместить код в подпрограмму, которую вы можете вызвать. Например:

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

Или

if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))
3 голосов
/ 26 сентября 2008

Или, возможно, я неправильно понял вопрос. Вы имели в виду что-то вроде iIf() в VB? Это работает для меня:

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

где returnIf() - это функция, подобная следующей:

function returnIf(uExpression, uTrue, uFalse)
    if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
1 голос
/ 12 сентября 2008

Да, это не лучшее решение, но мы используем что-то вроде этого

function ReplaceNull(s)
    if IsNull(s) or s = "" then
        ReplaceNull = "&nbsp;"
    else
        ReplaceNull = s
    end if
end function
1 голос
/ 12 сентября 2008

Если бы это было так, мой друг - TernaryOp - твоя единственная надежда.

0 голосов
/ 13 июля 2016

Вы можете просто использовать Else, чтобы поймать нули, "" и т. Д.

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

Я проверял это в своем коде, и в настоящее время он работает. Может быть, не подходит для ситуации каждого, хотя.

0 голосов
/ 26 сентября 2008

На ум приходят два варианта:

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
...