Lua의 반복자와 제네릭 for 루프

반복자와 클로저

반복자는 컬렉션 요소를 순회하는 포인터 구조입니다. 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

실행 단계:

  1. 초기화: expression_list 평가 (반복 함수, 상태 객체, 초기값 반환)
  2. 반복 함수 호출: 상태 객체와 제어 변수 전달
  3. 반환 값 변수 할당
  4. 첫 번째 반환값이 nil이면 종료
  5. 루프 반복

내부 동작 구조:

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

상태 없는 반복자 > 클로저 > 테이블 캡슐화 순으로 구현을 권장합니다.

태그: Lua 반복자 제네릭-for 클로저 상태-없는-반복자

7월 29일 11:48에 게시됨