개발공부/LUA

10.Lua 의 반복자

수박 서리 2024. 1. 30. 09:16

C++의 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

위의 코드는 반복자의 ipair 기능이 작동하는 방식을 모방하기 위해 약간 수정될 수 있습니다 . 아래에 나와 있습니다.

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

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

 

 

https://www.tutorialspoint.com/lua/lua_iterators.htm