이번 항목은 반복자에 대한 개념을 이해해야 지만 가능하다. C++ 에선 각 컨테이너에 대한 iterator 를 제공해 주고 있기 때문에, 그냥 사용만 하면 되지만, 루아에선 이런 iterator 가 없기 때문에 반복자를 직접 구현해야 한다.

루아에선 단 하나의 자료구조인 table만 제공해 주고, 유저가 직접 다른 자료구조를 구현해야 되기 때문에, 반복자를 확실히 짚고 넘어가야 할 것 같다.

우선 table을 훑으며, 다음 요소를 가리키게 할려면, 우선 반복자가 테이블의 어디에 위치해 있는가? 를 저장할 변수 1개와, 어떤 값인가? 를 저장할 변수 1개가 있어야 된다.

무론 변수가 있어야 한다는 것은 표현하기 위한 언어일 뿐, 논리적 변수(구조상 변수가 없어도 변수가 있는것 처럼 하게 하는 가상의 변수)여도 된다.


만약 아래와 같은 table 이 있다고 가정한다.

이때 각 요소를 리턴 하기 위해선 반복자가 table의 어디에 위치해 있는지 저장할 pos 와 해당 위치에 어떤 값인지 저장할 값이 있어야 한다.

이것을 루아로 표현 한다면

자 이렇게 구현 할 수 있을 것이다. 클로저가 C++ 의 함수 오브젝트와 비슷한 개념인것을 눈치 챈다면, 아주 쉽게 이해 될 수 있는 항목이니 반복자를 클로저로 구현하는 방법 쯤이야 식은 죽 먹기 일 것이다.

좀 더 깔끔하게 한다면, 라이브러리를 사용 하면 된다. 다음 코드를 보자.

이렇게 하면 되고 ipairs() 함수는 테이블에 대한 pos 와 값을 리턴해 주는 함수이며, 테이블의 끝에 왔을 때 nil 을 리턴 한다.


총평

일반 for 문은 다음 항목에 정리 되어 있으니, for 문에 in 이 무슨 의미인지는 나중에 알아 보도록 한다.


신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. JuHong 2012.01.24 21:41 신고  Addr  Edit/Del  Reply

    안녕하세요. 좋은 글들을 많이 써 주셔서 감사합니다.
    글을 읽다가 궁금한 점이 생겨 이렇게 질문을 하게 되었습니다.

    iterator 부분을 보니 function 내부에 function이 구현되어 있는데요.
    이걸 굳이 이렇게 해야하는 이유가 궁금합니다.
    왜 function 내부에 function을 만드는 건가요?
    그냥 function 하나로는 되지 않는건가요?