0Pricing
Lua Academy · 강의

클로저를 이용한 상태 저장 반복자

클로저로 호출 사이의 상태를 유지하는 반복자를 만듭니다.

클로저를 이용한 상태 저장 반복자은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

클로저가 유용한 경우

반복자가 복잡하고 계속 변하는 상태(위치, 스택, 이력)를 유지해야 할 때 클로저가 자연스러운 도구입니다. 상태는 Upvalue에 저장됩니다.

클로저 반복자 패턴

함수 하나만 반환하고 상태는 Upvalue에 저장합니다. 제네릭 for는 외부 상태를 제공하지 않고 매번 함수만 호출합니다.

local function chars(s)
  local i = 0
  return function()
    i = i + 1
    local c = s:sub(i, i)
    return c ~= "" and c or nil
  end
end
for c in chars("lua") do print(c) end

파일 줄 반복자

고전적인 상태 저장 클로저 반복자는 EOF에 도달할 때까지 파일 핸들에서 줄을 하나씩 반환합니다.

local function lines(filename)
  local f = io.open(filename, "r")
  return function()
    local line = f:read("*l")
    if not line then f:close() end
    return line
  end
end

필터링 반복자

기존 반복자를, 조건자와 일치하지 않는 요소를 건너뛰는 클로저로 감싸십시오.

local function filtered(iter, pred)
  return function()
    local v = iter()
    while v ~= nil and not pred(v) do
      v = iter()
    end
    return v
  end
end

매핑 반복자

매핑 반복자는 중간 테이블을 만들지 않고 각 요소를 즉시 변환합니다.

local function mapped(iter, fn)
  return function()
    local v = iter()
    if v ~= nil then return fn(v) end
  end
end

병합 반복자

병합 반복자는 두 반복자에서 동시에 값을 가져오며, 둘 중 하나라도 소진되면 중지합니다.

local function zipped(iter1, iter2)
  return function()
    local a, b = iter1(), iter2()
    if a ~= nil and b ~= nil then return a, b end
  end
end

연결 반복자

연결 반복자는 첫 번째 반복자를 모두 사용한 후 다음 반복자로 전환합니다.

local function chained(...)
  local iters = {...}
  local idx = 1
  return function()
    while idx <= #iters do
      local v = iters[idx]()
      if v ~= nil then return v end
      idx = idx + 1
    end
  end
end

개수 제한 반복자

클로저 카운터를 사용하여 반복자가 최대 N개의 값만 반환하도록 제한하십시오.

local function take(n, iter)
  local count = 0
  return function()
    count = count + 1
    if count <= n then return iter() end
  end
end

트리 순회 반복자

깊이 우선 트리 순회는 스택(상위 값으로 사용하는 테이블)을 사용하여 순회 상태를 유지합니다.

local function dfs(root)
  local stack = {root}
  return function()
    if #stack == 0 then return nil end
    local node = table.remove(stack)
    for _, child in ipairs(node.children or {}) do
      stack[#stack+1] = child
    end
    return node
  end
end

메모리 고려 사항

상태 저장 반복자는 클로저 객체를 할당합니다. 매우 촘촘한 내부 반복문에서는 상태 비저장 반복자가 더 적합할 수 있습니다. 복잡한 순회에서는 클로저를 사용하는 편이 충분히 가치 있습니다.

비교: 상태 저장 방식과 상태 비저장 방식

  • 상태 저장: 복잡한 상태를 유지하며, 어떤 순서로든 순회할 수 있고 작성하기 쉽습니다.
  • 상태 비저장: 단순한 순차 접근을 제공하고 할당이 없으며 빠릅니다.

상태 저장 반복자 질문

상태 저장 클로저 반복자는 상태를 어디에 저장합니까?

복습: 상태 저장 반복자

클로저 기반 상태 저장 반복자는 복잡한 순회 상태를 상위 값에 저장하므로 필터, 매핑, 트리, 지연 파이프라인을 모두 구성 가능하고 메모리 효율적으로 사용할 수 있습니다.

자주 묻는 질문

“클로저를 이용한 상태 저장 반복자” 강의는 무료인가요?

네 — “클로저를 이용한 상태 저장 반복자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“클로저를 이용한 상태 저장 반복자”에서 뭘 배우나요?

클로저로 호출 사이의 상태를 유지하는 반복자를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“클로저를 이용한 상태 저장 반복자” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 제네릭 for 프로토콜
  2. 무상태 반복자
  3. 클로저를 이용한 상태 저장 반복자
  4. 코루틴 기반 생성기
← Lua Academy(으)로 돌아가기