2010-01-21 30 views
10

Tôi phải thực hiện một số công việc ASP và tôi phát hiện ra rằng ngôn ngữ không cung cấp cách phát hiện mảng có độ dài bằng không (tốt, tôi cho rằng bạn có thể phát hiện ngoại lệ mà chúng ném khi bạn thử để sử dụng chúng ...). Tại sao Split() trả về một mảng trống nếu không có cách nào để xử lý nó? Hay tôi đang thiếu một cái gì đó?Các mảng không có chiều dài trong VBScript

Tôi đã pha chế bản hack sau để phát hiện các mảng trống, nhưng phải có cách dễ dàng hơn. Đó là nó? TIA

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

Có lẽ bạn nên được kiểm tra đầu vào của bạn trước khi chuyển đến Split() – Tester101

+0

VBScript và VBA là khá tương tự, vì vậy xem http:// stackoverflow.com/questions/206324/how-to-check-cho-empty-array-in-vba-macro/206526 # 206526 – Fionnuala

Trả lời

4

Một mảng rỗng tạo ra bằng cách sử dụng chức năng Array hoặc trả về bởi hàm VBScript nội tại khác, chẳng hạn như Split, có một giới hạn trên của -1. Vì vậy, bạn có thể thử nghiệm cho một mảng trống như sau:

Dim arr : arr = Array() 

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

Thông tin thêm tại đây: Testing for Empty Arrays.

+4

Mã của bạn không chính xác vì UBound không thành công trên các mảng trống. Trang bạn đã liên kết xác nhận sự nghi ngờ của tôi rằng cách duy nhất là phát hiện ra rằng một ngoại lệ được ném (hoặc bởi "của tôi cho mỗi" hack). Đó là buồn: -/ – angus

+2

@angus: anh ấy đúng vì mã của anh ấy trông giống như "kết quả mờ: results = Array()" – Totonga

+0

đồng ý với angus. – Pixie

2

Nếu phương pháp của bạn sẽ có thể trả về một mảng trống mã của bạn phải là như thế này

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() tạo ra một UBound = -1 mảng mà không có vòng trong cho mỗi vòng lặp.

6

Mục đích:

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) 

Sẽ trở lại -1 cho arr1, nhưng "VBScript lỗi runtime: subscript ra khỏi phạm vi: 'UBound" cho arr2 và arr3.

Một chức năng mục đích chung để kiểm tra nếu một mảng là "Dimmed" hoặc "Empty" cũng nên (có thể) kiểm tra nếu biến thực sự là một mảng.

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) 

Đối với tôi, 99% thời gian khi tôi đang kiểm tra nếu một mảng là "kích thước tương", là nếu tôi cần phải nhận được UBound của mảng và tôi muốn ngăn chặn một runtime lỗi trong các trường hợp trong đó mảng không được định kích thước. Vì vậy, tôi thường sẽ vượt qua UBound như một tham số như:

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

Tôi không biết nếu thực hành này thực sự tiết kiệm bất kỳ "Thời gian", nhưng nó tiết kiệm 1 dòng mã với gần như tất cả sử dụng, và là một cách dễ dàng để thực thi việc kiểm tra lỗi.

Ngoài ra, tôi đưa nó cho đầy đủ, nhưng trong thực tế, việc kiểm tra "UBound> = 0" trong IsDimmedArray:

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

thường là không cần thiết vì thông thường nó sẽ được sử dụng trong những trường hợp như :

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 

Vì vậy, trong trường hợp này, lintUBound = -1 và Đối ... Tiếp theo sẽ bị bỏ qua.

0

Tôi nghĩ rằng đây ist một cách tốt để kiểm tra một Array trong 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 
Các vấn đề liên quan