루아 반복자
반복자는 표준 템플릿 라이브러리 컨테이너의 일부 또는 모든 요소를 순회하는 데 사용할 수 있는 개체입니다. 각 반복자 개체는 컨테이너의 특정 주소를 나타냅니다.
Lua에서 반복자는 다음과 같습니다. 컬렉션의 각 요소를 탐색할 수 있는 포인터 유형을 지원하는 구조입니다.
Generic for iterator
Generic for는 반복 함수를 내부적으로 저장합니다. 실제로는 반복 함수, 상태 상수, 제어 변수의 세 가지 값을 저장합니다.
반복자의 제네릭은 컬렉션의 키/값 쌍을 제공합니다. 구문 형식은 다음과 같습니다.
for k, v in pairs(t) do print(k, v) end
위 코드에서 k와 v는 변수 쌍(t)입니다. 표현식 목록입니다.
다음 예 보기:
array = {"Lua", "Tutorial"} for key,value in ipairs(array) do print(key, value) end
위 코드 실행 출력은 다음과 같습니다.
1 Lua 2 Tutorial
위 예에서는 기본적으로 Lua에서 제공하는 반복 함수 ipairs를 사용합니다.
normative for의 실행 과정을 살펴보겠습니다:
먼저 in 이후 표현식의 값을 초기화하고 계산합니다. 표현식은 규범적인 내용을 반환해야 합니다. 세 가지 값: 반복 함수, 상태 상수, 제어 변수는 다중 값 할당과 마찬가지로 표현식에서 반환된 결과 수가 3개보다 적으면 자동으로 nil로 채워지고 초과분은 무시됩니다. .
두 번째, 상태 상수와 제어 변수를 매개변수로 사용하여 반복 함수를 호출합니다(참고: for 구조의 경우 상태 상수는 쓸모가 없습니다. 초기화 중에 해당 값을 가져오고 이를 반복 함수에 전달합니다).
셋째, 반복 함수에서 반환된 값을 변수 목록에 할당합니다.
넷째, 첫 번째 반환된 값이 nil이면 루프가 종료되고, 그렇지 않으면 루프 본문이 실행됩니다.
다섯째, 두 번째 단계로 돌아가 다시 반복 함수
를 호출합니다. Lua에서는 반복자를 설명하기 위해 함수를 자주 사용합니다. 함수가 호출될 때마다 컬렉션의 다음 요소가 반환됩니다. Lua의 반복자에는 다음 두 가지 유형이 포함됩니다.
상태 비저장 반복자
다중 상태 반복자
상태 없는 반복자
상태 없는 반복자는 어떤 상태도 유지하지 않는 반복자를 의미하므로 루프에서 상태 없는 반복자를 사용하여 클로저 생성을 피할 수 있습니다. 추가 비용이 듭니다.
각 반복에서 두 변수(상태 상수 및 제어 변수)의 값을 매개변수로 사용하여 반복 함수가 호출됩니다. 무상태 반복자는 이 두 값만 사용하여 다음 요소를 얻습니다.
이러한 종류의 상태 비저장 반복자의 전형적인 간단한 예는 배열의 각 요소를 반복하는 ipair입니다.
다음 예에서는 간단한 함수를 사용하여 반복자를 구현하고 숫자 n의 제곱을 실현합니다.
function square(iteratorMaxCount,currentNumber) if currentNumber<iteratorMaxCount then currentNumber = currentNumber+1 return currentNumber, currentNumber*currentNumber end end for i,n in square,3,0 do print(i,n) end
위 예의 출력 결과는 다음과 같습니다.
1 1 2 4 3 9
반복 상태에는 다음이 포함됩니다. 순회된 테이블(루프 중에 변경되지 않는 상태 상수)과 현재 인덱스 첨자(제어 변수), ipair 및 반복 함수는 다음과 같이 Lua에서 매우 간단하게 구현할 수 있습니다. 🎜>
function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 end
Lua가 루프를 시작하기 위해 ipairs(a)를 호출하면 세 가지 값, 즉 반복 함수 iter, 상태 상수 a, 제어 변수 초기 값 0을 얻은 다음 Lua는 iter(a,0)를 호출하여 1을 반환합니다. [1 ] (a[1]=nil이 아닌 경우); 두 번째 반복에서는 iter(a,1)을 호출하여 첫 번째 nil 요소까지 2, a[2]...를 반환합니다.
다중 상태 반복자
많은 경우 반복자는 단순한 상태 상수 및 제어 변수 대신 여러 상태 정보를 저장해야 하며, 가장 간단한 방법은 클로저 및 다른 방법을 사용하는 것입니다. 모든 상태 정보를 테이블로 캡슐화하고 테이블을 반복자의 상태 상수로 사용하는 것입니다. 이 경우 모든 정보가 테이블에 저장될 수 있으므로 반복 함수에는 일반적으로 두 번째 매개변수가 필요하지 않습니다.
다음 예에서는 자체 반복자를 만들었습니다.
array = {"Lua", "Tutorial"} function elementIterator (collection) local index = 0 local count = #collection -- 闭包函数 return function () index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end for element in elementIterator(array) do print(element) end
위 예의 출력 결과는 다음과 같습니다.
Lua Tutorial
위의 예에서 볼 수 있듯이, 클로저 함수는 elementIterator에서 세트의 크기를 계산하고 각 요소를 출력하는 데 사용됩니다.