Qual é a melhor maneira de iterar através de uma matriz no Classic Asp VBScript?
-
08-06-2019 - |
Pergunta
No código abaixo
For i = LBound(arr) To UBound(arr)
Qual é o sentido de perguntar usando LBound
?Certamente isso é sempre 0.
Solução
Por que não usar For Each
?Dessa forma você não precisa se preocupar com o que LBound
e UBound
são.
Dim x, y, z
x = Array(1, 2, 3)
For Each y In x
z = DoSomethingWith(y)
Next
Outras dicas
Há uma boa razão para NÃO USAR For i = LBound(arr) To UBound(arr)
dim arr(10)
aloca onze membros da matriz, de 0 a 10 (assumindo a Option Base padrão do VB6).
Muitos programadores VB6 assumem que o array é baseado em um e nunca usam o alocado arr(0)
.Podemos remover uma fonte potencial de bugs usando For i = 1 To UBound(arr)
ou For i = 0 To UBound(arr)
, porque então fica claro se arr(0)
está sendo usado.
For each
faz uma cópia de cada elemento do array, em vez de um ponteiro.
Isto tem dois problemas.
Quando tentamos atribuir um valor a um elemento do array, isso não reflete no original.Este código atribui um valor de 47 à variável
i
, mas não afeta os elementos dearr
.arr = Array(3,4,8) for each i in arr i = 47 next i Response.Write arr(0) '- returns 3, not 47
Não sabemos o índice de um elemento de array em um
for each
, e não temos garantia da sequência de elementos (embora pareça estar em ordem).
LBound
nem sempre pode ser 0.
Embora não seja possível criar um array que tenha algo diferente de 0 Limite inferior em VBScript, ainda é possível recuperar um array de variantes de um componente COM que pode ter especificado um valor diferente. LBound
.
Dito isto, nunca encontrei alguém que fizesse algo assim.
Provavelmente vem do VB6.Porque com Base de Opção instrução em VB6, você pode alterar o limite inferior dos arrays como este:
Option Base 1
Também no VB6, você pode alterar o limite inferior de um array específico assim:
Dim myArray(4 To 42) As String
Eu sempre usei For Each...