Lua-반복자
Iterator는 소위 컬렉션 또는 컨테이너의 요소를 순회 할 수있는 구조입니다. Lua에서 이러한 컬렉션은 종종 배열과 같은 다양한 데이터 구조를 만드는 데 사용되는 테이블을 참조합니다.
반복자를위한 일반
일반적인 대한 반복자는 컬렉션의 각 요소의 키 값 쌍을 제공합니다. 다음은 간단한 예입니다.
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
위의 코드를 실행하면 다음과 같은 결과가 나옵니다.
1 Lua
2 Tutorial
위의 예는 Lua에서 제공 하는 기본 ipairs 반복자 함수 를 사용합니다 .
Lua에서는 함수를 사용하여 반복자를 나타냅니다. 이 반복기 함수의 상태 유지 관리를 기반으로 두 가지 주요 유형이 있습니다.
- 상태 비 저장 반복기
- 상태 저장 반복자
상태 비 저장 반복기
이름 자체로 우리는 이러한 유형의 반복기 함수가 어떤 상태도 유지하지 않는다는 것을 이해할 수 있습니다.
이제 제곱을 인쇄하는 간단한 함수를 사용하여 자체 반복기를 만드는 예를 살펴 보겠습니다. 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
위의 코드는 반복자의 ipairs 기능이 작동 하는 방식을 모방하도록 약간 수정할 수 있습니다 . 아래와 같습니다.
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
function squares(iteratorMaxCount)
return square,iteratorMaxCount,0
end
for i,n in squares(3)
do
print(i,n)
end
위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
1 1
2 4
3 9
상태 저장 반복자
함수를 사용하는 반복의 이전 예는 상태를 유지하지 않습니다. 함수가 호출 될 때마다 함수에 전송 된 두 번째 변수를 기반으로 컬렉션의 다음 요소를 반환합니다. 현재 요소의 상태를 유지하기 위해 클로저가 사용됩니다. 클로저는 함수 호출에서 변수 값을 유지합니다. 새로운 클로저를 만들기 위해 클로저 자체와 팩토리, 클로저를 생성하는 함수를 포함하는 두 가지 함수를 만듭니다.
이제 클로저를 사용할 자체 반복자를 생성하는 예를 살펴 보겠습니다.
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- The closure function is returned
return function ()
index = index + 1
if index <= count
then
-- return the current element of the iterator
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.
Lua
Tutorial
위의 예에서 elementIterator에는 함수가 호출 될 때마다 인덱스를 증가시켜 컬렉션의 각 요소를 반환하는 로컬 외부 변수 index 및 count를 사용하는 또 다른 메서드가 내부에 있음을 알 수 있습니다.
위와 같이 클로저를 사용하여 자체 함수 반복기를 만들 수 있으며 컬렉션을 반복 할 때마다 여러 요소를 반환 할 수 있습니다.