У меня есть большое классическое приложение 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?





Вложенные IF (только немного менее подробные):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
Если бы это было, мой друг - TernaryOp - твоя единственная надежда.
Возможно, это не лучший способ, но он определенно работает ... Кроме того, если вы используете 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
Да, это не лучшее решение, но мы используем что-то вроде этого
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
Я всегда использовал операторы 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
Мой синтаксис может быть отключен, давно. Если появляется первый регистр, все остальное игнорируется.
На ум приходят два варианта:
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
Или, возможно, я неправильно понял вопрос. Вы имели в виду что-то вроде 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
Но разве rs("myField") не рассчитывается, а returnIf называется? В таком случае это не оценка короткого замыкания ...
Нет, эта функция не анализирует входные данные до тех пор, пока они вам не понадобятся, поэтому они не оцениваются (хотя вы можете передать выражение в качестве второго или третьего параметра, и в этом случае оно будет оцениваться на лету). И это совершенно зомби-ветка - этому ответу исполнилось месяц до 10 лет!
Несмотря на это (зомби-ветка) я искал ответ ... И да, он был нужен для реальной работы ...
Если вы напишете это как два встроенных оператора 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"))
Вы можете просто использовать 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
Я тестировал это в своем коде, и в настоящее время он работает. Хотя, возможно, не для всех.
Классический VB также не имеет настоящей тернарной операции, только функция IIf () (немедленно, если). Но даже это все еще функция, поэтому аргументы функции все должны быть оценены перед передачей в функцию.