Массивы нулевой длины в VBScript - PullRequest
12 голосов
/ 21 января 2010

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

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

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

Ответы [ 4 ]

6 голосов
/ 29 июля 2012

Для:

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.

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

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 ... Next будет пропущено.

4 голосов
/ 21 января 2010

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

Dim arr : arr = Array()

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

Подробнее здесь: Тестирование на пустые массивы .

2 голосов
/ 25 мая 2012

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

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, в котором нет цикла для каждого цикла.

1 голос
/ 22 января 2014

Я думаю, что это хороший способ проверить массив в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...