Para o ciclo em Lua
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Já tentei outras coisas, mas não funciona, o terminal só Lista 1, 2, 3... O que estou a fazer de errado?
3 answers
O teu 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
. Depois, começas um loop for. A variável for loop declara uma local que acontece ser chamada names
também; o facto de uma variável ter sido previamente definida com names
é completamente irrelevante. Qualquer uso de names
dentro do laço for irá referir-se ao local}, não ao global.
names = 1
, depois names = 2
, e finalmente names = 3
. O laço for declara um contador que conta desde o primeiro número até o último, e chamará o código interno uma vez por cada valor que conta.
O que realmente querias era algo parecido com isto.
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
A sintaxe [] é como se acede aos membros de uma tabela Lua. As tabelas Lua mapeiam "chaves"para " valores". Seu array cria automaticamente chaves de tipo inteiro, que aumentam. Então a chave associada com " Joe " na a tabela é 2(os índices Lua começam sempre em 1).
Portanto, você precisa de um laço for que conta de 1 a 3, que você recebe. Você usa a variável contagem para acessar o elemento a partir da tabela.
No entanto, isto 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, temos John Joe nil
, Porque tentar aceder aos valores de uma tabela que não existe resulta em nil
. Para evitar isso, precisamos contar de 1 para o Comprimento do quadro:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
O {[14] } é o operador de comprimento. Ele trabalha em mesas e cordas, retornando o comprimento de ambos. Agora, não importa o quão grande ou pequeno names
fique, isto sempre funcionará.
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
é uma função padrão Lua que itera sobre uma lista. Este estilo de laço de for
, o iterador para laço, usa este tipo de função iterator. O valor i
é o índice da entrada na estação. O valor name
é o valor desse índice. Então basicamente faz muito trabalho duro para você.
Modo 1
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
, na sua tabela names
cada elemento tem uma chave a partir de 1, por exemplo:
names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John
Então, faz com que vá de 1 para 3.
Em Way2 em vez disso, você indica qual a tabela que deseja executar e atribui uma variável para a 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
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
-
Estás a apagar a tua mesa e a substituí-la por um int
Não estás a tirar um valor da tabela.
Tenta:
names = {'John','Joe','Steve'}
for i = 1,3 do
print(names[i])
end