수색…


일반 For 루프

반복자는 generic for 루프 라고하는 for 루프의 형식을 사용합니다.

for 루프의 일반적인 형식은 세 개의 매개 변수를 사용합니다.

  1. 다음 값이 필요할 때 호출되는 반복자 함수 . 불변 상태와 제어 변수를 매개 변수로받습니다. nil 신호를 반환하면 종료됩니다.
  2. 불변 상태 는 반복 중에 변경되지 않는 값입니다. 일반적으로 iterator의 대상 (예 : 테이블, 문자열 또는 사용자 데이터)입니다.
  3. 제어 변수 는 반복의 초기 값을 나타냅니다.

우리는 for 루프를 작성하여 다음 함수를 사용하여 테이블의 모든 키 - 값 쌍을 반복 할 수 있습니다.

local t = {a=1, b=2, c=3, d=4, e=5}

-- next is the iterator function
-- t is the invariant state
-- nil is the control variable (calling next with a nil gets the first key)
for key, value in next, t, nil do
  -- key is the new value for the control variable
  print(key, value) 
  -- Lua calls: next(t, key)  
end

표준 반복자

루아 표준 라이브러리는 테이블 내에서 키 - 값 쌍을 트래버스하기 for 루프와 함께 사용할 수있는 두 개의 반복자 함수를 제공합니다.

시퀀스 테이블을 반복하기 위해 라이브러리 함수 ipairs를 사용할 수 있습니다.

for index, value in ipairs {'a', 'b', 'c', 'd', 'e'} do
  print(index, value)  --> 1 a, 2 b, 3 c, 4 d, 5 e
end

모든 테이블의 모든 키와 값에 대한 반복자에 라이브러리 함수 쌍을 사용할 수 있습니다.

for key, value in pairs {a=1, b=2, c=3, d=4, e=5} do
  print(key, value)  --> e 5, c 3, a 1, b 2, d 4  (order not specified)
end

Stateless Iterators

자식 쌍은 모두 stateless iterator를 나타냅니다. 상태 비 저장 반복자는 일반 for 루프의 제어 변수 및 불변 상태 만 사용하여 반복 값을 계산합니다.

쌍 반복기

next 함수를 사용하여 상태 비 저장 pairs 반복자를 구현할 수 있습니다.

-- generator function which initializes the generic for loop
local function pairs(t)
  -- next is the iterator function
  -- t is the invariant state
  -- control variable is nil
  return next, t, nil
end

Ipairs Iterator

우리는 stateless ipairs iterator를 두 개의 분리 된 함수로 구현할 수있다.

-- function which performs the actual iteration
local function ipairs_iter(t, i)
  local i = i + 1  -- next index in the sequence (i is the control variable)
  local v = t[i]   -- next value (t is the invariant state)
  if v ~= nil then
    return i, v    -- index, value
  end
  return nil       -- no more values (termination)
end

-- generator function which initializes the generic for loop
local function ipairs(t)
  -- ipairs_iter is the iterator function
  -- t is the invariant state (table to be iterated)
  -- 0 is the control variable (first index)
  return ipairs_iter, t, 0
end

문자 반복자

generic for 루프의 계약을 이행하여 새로운 상태없는 반복자를 만들 수 있습니다.

-- function which performs the actual iteration
local function chars_iter(s, i)
  if i < #s then
    i = i + 1
    return i, s:sub(i, i)
  end
end

-- generator function which initializes the generic for loop
local function chars(s)
  return chars_iter, s, 0
end

-- used like pairs and ipairs
for i, c in chars 'abcde' do
    print(i, c) --> 1 a, 2 b, 3 c, 4 f, 5 e
end

소수 Iterator

이것은 상태 비 저장 반복자의 간단한 예입니다.

-- prime numbers iterator
local incr = {4, 1, 2, 0, 2}
function primes(s, p, d)
   s, p, d = s or math.huge, p and p + incr[p % 6] or 2, 1
   while p <= s do
      repeat
         d = d + incr[d % 6]
         if d*d > p then return p end
      until p % d == 0
      p, d = p + incr[p % 6], 1
   end
end

-- print all prime numbers <= 100
for p in primes, 100 do  -- passing in the iterator (do not call the iterator here)
   print(p)  -->  2  3  5  7  11 ... 97
end

-- print all primes in endless loop
for p in primes do  -- please note: "in primes", not "in primes()"
   print(p)
end

스테이트 풀 반복자

상태 저장 (Stateful) 반복자는 반복자의 현재 상태에 대한 몇 가지 추가 정보를 담고 있습니다.

표 사용하기

추가 상태는 일반 for 루프의 불변 상태로 패킹 될 수 있습니다.

  local function chars_iter(t, i)
    local i = i + 1
    if i <= t.len then
      return i, t.s:sub(i, i)
    end
  end

  local function chars(s)
    -- the iterators state
    local t = {
      s = s,    -- the subject
      len = #s  -- cached length
    }
    return chars_iter, t, 0
  end

  for i, c in chars 'abcde' do
    print(i, c) --> 1 a, 2 b, 3 c, 4 d, 5 e
  end

클로저 사용

추가 상태는 함수 클로저 내에 래핑 될 수 있습니다. 상태가 클로저의 범위에 완전히 포함되어 있으므로 불변 상태 및 제어 변수가 필요하지 않습니다.

  local function chars(s)
    local i, len = 0, #s
    return function() -- iterator function
      i = i + 1
      if i <= len then
        return i, s:sub(i, i)
      end
    end
  end

  for i, c in chars 'abcde' do
    print(i, c) --> 1 a, 2 b, 3 c, 4 d, 5 e
  end

코 루틴 사용하기

추가 상태가 코 루틴 내에 포함될 수 있으며, 다시 불변 상태 및 제어 변수가 필요하지 않습니다.

  local function chars(s)
    return coroutine.wrap(function()
      for i = 1, #s do
        coroutine.yield(s:sub(i, i))
      end
    end)
  end

  for c in chars 'abcde' do
    print(c) --> a, b, c, d, e
  end


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow