Lua의 For 루프


87

내 과제는 for 루프를 수행하는 방법입니다. 나는 그것을 숫자로 알아 냈지만 이름으로는 알아낼 수 없다. 이름 목록을 실행하는 for 루프를 만들고 싶습니다. 다음은 내가 지금까지 가지고있는 것입니다.

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

나는 다른 것을 시도했지만 작동하지 않습니다. 터미널은 항상 1, 2, 3을 나열합니다 ... 내가 뭘 잘못하고 있니?

답변:


204

문제는 간단합니다.

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

이 코드는 먼저라는 전역 변수를 선언합니다 names. 그런 다음 for 루프를 시작합니다. for 루프는 호출 되는 지역 변수를 선언합니다 names. 변수가 이전에 정의되었다는 사실 names은 완전히 관련이 없습니다. namesfor 루프 내부의 모든 사용은 전역 루프가 아닌 로컬 루프를 참조합니다 .

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값은 해당 인덱스의 값입니다. 그래서 그것은 기본적으로 당신을 위해 많은 지저분한 일을합니다.


1
그래서, () ipairs에 대한 것은 다른 언어의 foreach ()로 작동
boctulus

15
훌륭한 대답, 나는 마지막 예제 _에서 var가 사용되지 않을 때 사용하는 것이 매우 관례 적이라고 덧붙일 것입니다 . 예names = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Fraser

19

온라인 ( tables tutorial ) 을 읽으면 테이블이 배열처럼 동작하는 것처럼 보이므로 다음을 찾고 있습니다.

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 은 table을 사용합니다. 테이블 index/key에서 names각 요소에는 1부터 시작하는 키가 있습니다. 예를 들면 다음과 같습니다.

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

그래서 당신 i은 1에서 3으로 이동합니다.

Way2 대신에 당신은 당신이 실행하고, 예를 들어 그 키와 값에 대한 변수를 할당 할 것을 테이블 지정

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

다음을 인쇄합니다.

1   John
2   Joe
myKey   myValue

6
당신은 테이블 튜토리얼을 읽었지만 보지 못했 ipairs습니까? 아니면 pairs특정 순서로 키 값을 반환 할 필요가없는 부분 ?
Nicol Bolas 2011 년

ipairs처음에는 실제로 사용 했지만 숫자가 아닌 키에 myKey="myValue"필요한 예제를 추가했을 때 pairs나머지도 변경하기로 결정했습니다 pairs. 주문이 쌍으로 보장되지 않는다는 점을 생략하면 미안하지만 그가 읽을 수 있도록 링크를 바로 남겨 두었습니다.
derp

1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. 테이블을 삭제하고 int로 대체합니다.
  2. 당신은 테이블에서 값을 가져 오지 않습니다

시험:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end

1
반대 투표자 : 반대 투표에 대한 유효한 이유를 입력하세요. 범위 names에서 선언 된대로 (정수 카운터) 가 전역 범위에서 선언 된대로 (테이블 배열) for을 숨기는 지역 변수를 도입 한다는 점에서 대답이 오해의 소지가 있다고 생각하지만 names.
Dejavu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.