Seu problema é simples:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Este código primeiro declara uma variável global chamada names
. Então, você inicia um loop for. O laço for declara uma variável local que names
também é chamada ; o fato de uma variável ter sido previamente definida com names
é totalmente irrelevante. Qualquer uso de names
dentro do loop for se referirá ao local , não ao global.
O loop for diz que a parte interna do loop será chamada com names = 1
, then names = 2
, e finalmente names = 3
. O loop for declara um contador que conta do primeiro ao último número e chama o código interno uma vez para cada valor que conta.
O que você realmente queria era algo assim:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
A sintaxe [] é como você acessa os membros de uma tabela Lua. As tabelas Lua mapeiam "chaves" para "valores". Seu array cria automaticamente chaves do tipo inteiro, que aumentam. Portanto, a chave associada a "Joe" na tabela é 2 (os índices Lua sempre começam em 1).
Portanto, você precisa de um loop for que conta de 1 a 3, que você obtém. Você usa a variável de contagem para acessar o elemento da tabela.
No entanto, isso tem uma falha. O que acontece se você remover um dos elementos da lista?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Agora, entendemos John Joe nil
, porque tentar acessar valores de uma tabela que não existe resulta em nil
. Para evitar isso, precisamos contar de 1 até o comprimento da mesa:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
O #
é o operador de comprimento. Funciona em tabelas e strings, retornando o comprimento de cada uma. Agora, não importa o quão grande ou pequeno names
seja, isso sempre funcionará.
No entanto, há uma maneira mais conveniente de iterar por meio de uma série de itens:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
é uma função padrão da Lua que itera em uma lista. Este estilo de for
loop, o iterator for loop, usa esse tipo de função iteradora. O i
valor é o índice da entrada na matriz. O name
valor é o valor desse índice. Basicamente, ele faz muito trabalho pesado para você.