Нулевые массивы в VBScript

Мне нужно выполнить некоторую работу ASP, и я узнал, что язык не обеспечивает способ обнаружения массивов нулевой длины (ну, я полагаю, вы можете обнаружить исключение, которое они бросают, когда пытаетесь их использовать...). Почему Split() возвращает пустой массив, если нет разумного способа его обработки? Или я что-то упускаю?

Я придумал следующий хак для обнаружения пустых массивов, но должен быть более простой способ. Что он? ТИА

function ArrayEmpty (a)
    dim i, res
    res = true
    for each i in a
        res = false
        exit for
    next
    ArrayEmpty = res
end function

Ответ 1

Для:

Dim arr1 : arr1 = Array()
Dim arr2
Dim arr3 : ReDim arr3(1) : Erase arr3
WScript.Echo UBound(arr1)
WScript.Echo UBound(arr2)
WScript.Echo UBound(arr3)

Вернет -1 для arr1, но "Ошибка выполнения VBScript: подстрочный индекс:" UBound "для arr2 и arr3.

Функция общего назначения, чтобы проверить, является ли массив "Dimmed" или "Empty", также должен (вероятно) проверить, является ли эта переменная фактически массивом.

Function IsDimmedArray(arrParam)

Dim lintUBound : lintUBound = 0
Dim llngError  : llngError = 0

    IsDimmedArray = False
    If Not IsArray(arrParam) Then : Exit Function

 '' Test the bounds
    On Error Resume Next

        lintUBound = UBound(arrParam)
        llngError = Err.Number
        If (llngError <> 0) Then : Err.Clear

    On Error Goto 0
    If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True

End Function                  ' IsDimmedArray(arrParam)

Для меня в 99% случаев, когда я проверяю, является ли массив "размерным", если мне нужно получить UBound этого массива, и я хочу предотвратить ошибку времени выполнения в тех случаях, когда массив не имеет размеров. Поэтому я обычно передаю UBound как параметр, например:

Function IsDimmedArray(arrParam, intUBoundParam)
    intUBoundParam = 0
    ...

Я не знаю, действительно ли эта практика сохраняет какое-либо "время", но она сохраняет 1 строку кода почти при каждом использовании и является простым способом обеспечить соблюдение практики проверки ошибок.

Кроме того, я включаю его для полноты, но на практике проверка "UBound >= 0" в IsDimmedArray:

    If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True

обычно не требуется, потому что обычно он будет использоваться в таких случаях, как:

Dim arrX
Dim lintUBound
Dim intNdx

arrX = Array()
lintUBound = UBound(arrX)
WScript.Echo "arrX is an array with UBound=" & lintUBound

For intNdx = 0 to lintUBound
    WScript.Echo "This will not print: " & intNdx
Next

Итак, в этом случае lintUBound = -1, а параметр For... Далее будет пропущен.

Ответ 2

Пустой массив, созданный с помощью функции Array или возвращаемый другими внутренними функциями VBScript, например Split, имеет верхнюю границу -1. Таким образом, вы можете проверить пустой массив следующим образом:

Dim arr : arr = Array()

If UBound(arr) >= 0 Then
  ' arr is non-empty
Else
  ' arr is empty
End If

Дополнительная информация здесь: Тестирование пустых массивов.

Ответ 3

Если ваш метод должен иметь возможность возвращать пустой массив, ваш код должен быть таким

Option Explicit

dim result : result = mymethod
if(NOT ubound(result) > 0) then MsgBox "Array Is Empty"
dim elem : for each elem in result
  MsgBox "Element"
Next

Function mymethod
  dim results : results = Array()
  mymethod = results
End Function

Array() создает массив Ubound = -1, который не имеет цикла для каждого цикла.

Ответ 4

Я думаю, что это хороший способ проверить массив в VBS

Dim myArray
myArray = Array()
sTest = IsArrayEmpty(myArray)
Msgbox (sTest) ' True
Function IsArrayEmpty(myArray)
    iRet = True

    If IsArray(myArray) Then
        i = 0
        For Each e In myArray
            If Not IsEmpty(e) And Len(e)>0 Then
                i = i +1
            End If
        Next
        If i>0 Then
            iRet = False
        End If
    End If
    wIsArrayEmpty = iRet
End Function