Обходной путь условного короткого замыкания VBScript

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
16 049
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Вложенные IF (только немного менее подробные):

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

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

Классический VB также не имеет настоящей тернарной операции, только функция IIf () (немедленно, если). Но даже это все еще функция, поэтому аргументы функции все должны быть оценены перед передачей в функцию.

Joel Coehoorn 12.09.2008 22:43
Ответ принят как подходящий

Возможно, это не лучший способ, но он определенно работает ... Кроме того, если вы используете 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 = "&nbsp;"
    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 называется? В таком случае это не оценка короткого замыкания ...

realsonic 20.07.2018 08:27

Нет, эта функция не анализирует входные данные до тех пор, пока они вам не понадобятся, поэтому они не оцениваются (хотя вы можете передать выражение в качестве второго или третьего параметра, и в этом случае оно будет оцениваться на лету). И это совершенно зомби-ветка - этому ответу исполнилось месяц до 10 лет!

Cirieno 23.08.2018 21:24

Несмотря на это (зомби-ветка) я искал ответ ... И да, он был нужен для реальной работы ...

realsonic 24.08.2018 22:17

Если вы напишете это как два встроенных оператора 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

Я тестировал это в своем коде, и в настоящее время он работает. Хотя, возможно, не для всех.

Другие вопросы по теме