반복자와 클로저
반복자는 컬렉션 요소를 순회하는 포인터 구조입니다. Lua에서는 함수로 구현하며, 호출 시 다음 요소를 반환합니다. 반복자는 이전 호출 상태를 유지해야 하며, 클로저가 이를 효과적으로 구현합니다. 클로저는 외부 함수의 지역 변수에 접근 가능한 내부 함수로, 호출 간 상태를 보존합니다.
리스트 순회 반복자 예시 (값 반환):
function create_list_iterator(elements)
local index = 0
local total = #elements
return function()
index = index + 1
if index <= total then
return elements[index]
end
end
end
사용 예시:
local values = {"A", "B", "C"}
for item in create_list_iterator(values) do
print(item)
end
제네릭 for 동작 원리
제네릭 for 루프는 반복 프로세스를 자동 관리합니다:
for var1, var2 in expression_list do
-- 코드 블록
end
실행 단계:
- 초기화: expression_list 평가 (반복 함수, 상태 객체, 초기값 반환)
- 반복 함수 호출: 상태 객체와 제어 변수 전달
- 반환 값 변수 할당
- 첫 번째 반환값이 nil이면 종료
- 루프 반복
내부 동작 구조:
do
local func, state, control = expression_list
while true do
local var1, var2 = func(state, control)
control = var1
if not control then break end
-- 코드 블록 실행
end
end
상태 없는 반복자
상태 객체와 제어 변수만으로 동작하는 반복자로, ipairs가 대표적입니다:
function sequence_iter(items, pos)
pos = pos + 1
local value = items[pos]
if value then
return pos, value
end
end
function custom_ipairs(items)
return sequence_iter, items, 0
end
상태 보존 반복자
복잡한 상태는 테이블로 캡슐화합니다:
function word_generator()
local state = { text = io.read(), position = 1 }
return next_word, state
end
function next_word(state)
while state.text do
local start_idx, end_idx = string.find(state.text, "%w+", state.position)
if start_idx then
state.position = end_idx + 1
return string.sub(state.text, start_idx, end_idx)
else
state.text = io.read()
state.position = 1
end
end
end
상태 없는 반복자 > 클로저 > 테이블 캡슐화 순으로 구현을 권장합니다.