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를 사용하는 또 다른 메서드가 내부에 있음을 알 수 있습니다.

위와 같이 클로저를 사용하여 자체 함수 반복기를 만들 수 있으며 컬렉션을 반복 할 때마다 여러 요소를 반환 할 수 있습니다.