Обходной путь для устранения условного короткого замыкания в VBScript
-
09-06-2019 - |
Вопрос
У меня есть большое классическое приложение ASP, которое я должен поддерживать, и я неоднократно сталкиваюсь с трудностями из-за отсутствия возможности оценки короткого замыкания.Например, VBScript не позволит вам уйти от:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
...потому что, если Rs("MyField") равно null, вы получите ошибку во втором условии, сравнивая null с 0.Так что обычно я заканчиваю тем, что делаю это вместо этого:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
Очевидно, что многословие довольно ужасающее.Просматривая эту большую базу кода, лучший обходной путь, который я нашел, - это использовать функцию, написанную оригинальным программистом, под названием TernaryOp , которая в основном использует функциональность, подобную троичному оператору, но я все еще застрял, используя временную переменную, которая не была бы необходима в более полнофункциональном языке.Есть ли способ получше?Какой-то сверхсекретный способ короткого замыкания действительно существует в VBScript?
Решение
Может быть, не самый лучший способ, но он определенно работает...Кроме того, если вы используете 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
Другие советы
Вложенные IFS (только немного менее подробные):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
Я всегда использовал операторы 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
Возможно, мой синтаксис не работает, прошло некоторое время.Если всплывает первый случай, все остальное игнорируется.
Или, возможно, я неправильно понял вопрос.Вы имели в виду что-то вроде iIf()
в VB?Это работает для меня:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
где returnIf()
это функция, подобная so:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
Если вы напишете это как два встроенных 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"))
Если бы это было так, мой друг ... TernaryOp - твоя единственная надежда.
Да, это не лучшее решение, но мы используем что-то вроде этого
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
На ум приходят два варианта:
1) использовать len()
или lenb()
чтобы узнать, есть ли какие-либо данные в переменной:
if not lenb(rs("myField"))=0 then...
2) используйте функцию, которая возвращает логическое значение:
if not isNothing(rs("myField")) then...
где isNothing()
это функция, подобная 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
Возможно, вы сможете просто использовать Else
чтобы ловить нули ", "s" и т.д.
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
Я протестировал это в своем коде, и в настоящее время это работает.Хотя, возможно, это подходит не для каждой конкретной ситуации.