문제는 간단합니다.
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
이 코드는 먼저라는 전역 변수를 선언합니다 names
. 그런 다음 for 루프를 시작합니다. for 루프는 호출 되는 지역 변수를 선언합니다 names
. 변수가 이전에 정의되었다는 사실 names
은 완전히 관련이 없습니다. names
for 루프 내부의 모든 사용은 전역 루프가 아닌 로컬 루프를 참조합니다 .
for 루프는 루프의 내부 부분이 names = 1
, then names = 2
및 finally 로 호출 될 것이라고 말합니다 names = 3
. for 루프는 첫 번째 숫자부터 마지막 숫자까지 계산 하는 카운터 를 선언하고 계산하는 각 값에 대해 내부 코드를 한 번씩 호출합니다.
실제로 원했던 것은 다음과 같습니다.
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
[] 구문은 Lua 테이블의 멤버에 액세스하는 방법입니다. Lua 테이블은 "키"를 "값"에 매핑합니다. 배열은 정수 유형의 키를 자동으로 생성하여 증가합니다. 따라서 테이블에서 "Joe"와 관련된 키는 2입니다 (Lua 인덱스는 항상 1에서 시작).
따라서 1에서 3까지 세는 for 루프가 필요합니다. count 변수를 사용하여 테이블의 요소에 액세스합니다.
그러나 이것은 결함이 있습니다. 목록에서 요소 중 하나를 제거하면 어떻게됩니까?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
이제 John Joe nil
존재하지 않는 테이블의 값에 액세스하려고하면 nil
. 이를 방지하려면 1부터 테이블 길이 까지 세어야 합니다.
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
는 #
길이 연산자이다. 테이블과 문자열에서 작동하며 둘 중 하나의 길이를 반환합니다. 이제 아무리 크든 작든 상관없이 names
항상 작동합니다.
그러나 항목 배열을 반복하는 더 편리한 방법이 있습니다.
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
목록을 반복하는 Lua 표준 함수입니다. 이 스타일의 for
루프 인 반복기 for 루프는 이러한 종류의 반복기 함수를 사용합니다. i
값 어레이에서 엔트리의 인덱스이다. name
값은 해당 인덱스의 값입니다. 그래서 그것은 기본적으로 당신을 위해 많은 지저분한 일을합니다.