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ê.
_
quando o var não é usado. Exnames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Ao ler online ( tutorial de tabelas ), parece que as tabelas se comportam como arrays, então você está procurando:
Way1
names = {'John', 'Joe', 'Steve'} for i = 1,3 do print( names[i] ) end
Way2
names = {'John', 'Joe', 'Steve'} for k,v in pairs(names) do print(v) end
Way1 usa a tabela
index/key
, em sua tabelanames
cada elemento possui uma chave a partir de 1, por exemplo:names = {'John', 'Joe', 'Steve'} print( names[1] ) -- prints John
Então, basta
i
passar de 1 para 3.Em vez disso, no Way2 você especifica qual tabela deseja executar e atribui uma variável para sua chave e valor, por exemplo:
names = {'John', 'Joe', myKey="myValue" } for k,v in pairs(names) do print(k,v) end
imprime o seguinte:
1 John 2 Joe myKey myValue
fonte
ipairs
? Ou a parte empairs
que não é necessário retornar os valores-chave em nenhuma ordem específica?ipairs
no início, mas quando adicionei omyKey="myValue"
exemplo que precisapairs
da tecla não numérica, decidi alterar o restopairs
também. Me desculpe se omiti que o pedido não é garantido com pares mas deixei o link ali para ele ler.names = {'John', 'Joe', 'Steve'} for names = 1, 3 do print (names) end
Tentar:
names = {'John','Joe','Steve'} for i = 1,3 do print(names[i]) end
fonte
names
(o contador de inteiros), conforme declarado nofor
escopo, introduz uma variável local, que obscurecenames
(a matriz da tabela) conforme declarado no escopo global.