반응형

for 문에 사용할 iterator 함수를 사용자가 직접 만들 수 있습니다.

 

다음의 내용은 lua-users wiki 에 있는 사용자 iterator 함수의 pseudo-code 입니다.

 

-- Equivalent to "for var1, ···, varn in explist do block end"
do
  local iterator, state, var1 = explist
  local var2, ... , varn
  while true do
    var1, ..., varn = iterator(state, var1)
    if var1 == nil then break end
      -- for block code
  end
end

 

좀 어려우니 예제를 살펴봅시다.

 루아스크립트,web,프로그래밍,웹프로그래밍,웹

function square(state,n) if n<state then n=n+1 return n,n*n end end
for i,n in square,5,0 do print(i,n) end

결과

1 1
2 4
3 9
4 16
5 25

위의 코드를 보면 square 라는 iterator 용으로 사용할 함수를 하나 만들었습니다.

이 함수를 for 문에 적용하여 iterator 역할을 수행하도록 만든 것 입니다.

 

square 함수는 state 와 n 이라는 인수를 받아서 n 이 state 보다 작을때는 n=n+1 을 해주고 return 으로

n 과 n*n 을 돌려줍니다. 2개의 값을 돌려주며, 루아에서는 함수가 한개 이상(다수의) return을 할 수 있다는 것을

알기 바랍니다. 어쨌든 위의 경우 n 과 n*n 즉 n의 제곱을 돌려주고 있습니다.

 

이 함수를 for 문의 iterator로 사용하였습니다.

 

in square,5,0 이라는 부분이 iterator 부분을 구성합니다.

 

즉 square 함수를 state = 5, n = 0 으로 초기화 하여 지속적으로 호출해 줍니다.

단 명심해야 할 것은 square 함수 자체가 지속적으로 호출되는 것이 아닙니다.

다시 말해 square 함수가 호출되면 지속적으로 함수에 인수가 전달되어야 겠죠. 그러나 이렇게 지속적으로 인수가 전달되는

것이 아닙니다. 인수는 처음에만 전달되고, 그 상태가 지속적으로 그 후에도 남게 됩니다.

 

잘보시면 square 함수의 인수에 n 이라는 변수가 있습니다. 인수로 사용한 변수이지요.

또한 for 문에 보면 i,n 에  역시 n 이라는 변수가 사용됩니다.

 

이 두게 모두 local 변수이므로 서로 다른 변수 인것을 알아야 합니다.

 

위의 코드를 분석하면 , for 문에 들어가 square 함수가 호출되어 state 및 n 에 각각 5 와 0 이 할당되어지고

square 함수의 내부계산에 의하여 return 되는 두개의 값(n,n*n) 이 각각 for 문의 i,n 에 전달되게 되어

for 문의 블럭인 print(i,n) 에서 i 와 n 즉  n,n*n 이 출력되어지고 다시 square 내부 계산이 이루어지며

조건에 맞을때 다시 n,n*n 이 return 되어 집니다.

 

조건이 만족하지 못하면 square 문은 아무것도 return 하지 않고 함수 자체가

종결이 되며 for 문의 i,n 은 nil 의 값을 받게 되어서 결국 for 문이 종료되게 되어 있습니다.

 

좀 복잡하지만, 또한 논리적으로 이해하기 힘들 수 있습니다만, 이것이 루아의 특징이라고 생각하시기 바랍니다.

 

function squares(nbvals) return square,nbvals,0 end  -- iterator,state,initial value


for i,n in squares(5) do print(i,n) end
1       1
2       4
3       9
4       16
5       25

위와 같이 squares 라는 함수를 다시 하나 더 만들어 pairs 또는 ipairs 와 같이 일반적인 iterator 함수와 같은 역할을

수행하는 함수를 만들어 사용할 수 도 있습니다.

+ Recent posts