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 함수와 같은 역할을
수행하는 함수를 만들어 사용할 수 도 있습니다.
'Programming > LUA' 카테고리의 다른 글
[루아스크립트/프로그래밍]루아(LUA)Matrix (2차원 배열) 은 ? (0) | 2018.05.20 |
---|---|
[루아스크립트/프로그래밍]루아(LUA)배열 (Array) (0) | 2018.05.18 |
[루아스크립트/프로그래밍]루아(LUA)함수의 인수는 global 인가 local 인가? (0) | 2018.05.17 |
[루아스크립트/프로그래밍]루아(LUA)for 문에 대한 tutorial (2) (0) | 2018.05.17 |
[루아스크립트/프로그래밍]루아(LUA)for 문에 대한 tutorial (1) (0) | 2018.05.13 |