Para o ciclo em Lua

A minha missão é como fazer um loop. Descobri em termos de números, mas não consigo descobrir em termos de nomes. Eu gostaria de criar um laço for que executa abaixo uma lista de nomes. Isto é o que eu tenho até agora:

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?

Author: Yu Hao, 2011-10-01

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.

O laço for diz que a parte interior do laço será chamada com 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á.

No entanto, há uma maneira mais conveniente de iterar através 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 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ê.

 157
Author: Nicol Bolas, 2011-10-01 00:39:50
Ao ler online ([[10]} tutorial de tabelas parece que as tabelas se comportam como arrays por isso você está procurando:

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
 13
Author: derp, 2011-09-30 22:03:32
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
 -1
Author: Elliot, 2016-01-22 00:54:26