web-dev-qa-db-ja.com

VBScriptの長さゼロの配列

私はいくつかのASP作業をしなければなりません、そして私は言語が長さゼロの配列を検出する方法を提供しないことを知りました(まあ、あなたが試みるときそれらが投げる例外を検出できると思いますそれらを使用するには...)それを処理するための正しい方法がないのに、Split()が空の配列を返すのはなぜですか?または何かが足りないのですか?

空の配列を検出するために次のハックを作成しましたが、もっと簡単な方法が必要です。どっち? TIA

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

Array関数を使用して作成された、またはSplitなどの他の組み込みVBScript関数によって返される空の配列の上限は、-1です。したがって、次のように空の配列をテストできます。

Dim arr : arr = Array()

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

詳細はこちら: 空の配列のテスト

6
Helen

ために:

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)

Arr1に対して-1を返しますが、arr2およびarr3に対して「VBScriptランタイムエラー:添え字が範囲外です: 'UBound'」。

配列が「薄暗い」または「空」であるかどうかをテストする汎用関数は、変数が実際に配列であるかどうかも(おそらく)テストする必要があります。

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行のコードが節約され、エラーチェックの方法を強制する簡単な方法です。

また、完全を期すためにこれを含めますが、実際には、IsDimmedArrayで"UBound> = 0"をチェックします。

    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はスキップされます。

6
Kevin Fegan

メソッドが空の配列を返すことができる必要がある場合、コードは次のようになっている必要があります

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()は、foreachループにループがないUbound = -1配列を作成します。

2
Totonga

これは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
1
schorschi

TechNet で、配列をチェックするために VarType を使用することを提案するスレッドを見つけました。

Function ArrayEmpty (a)
    If VarType(a) < 8192 Then ArrayEmpty=True Else ArrayEmpty=False
End Function

それは私のために働いた。

0
Rob