2012-03-30 2 views
2

나는 루아에서 메타 테이블로 물건을 전달하고 C++를 호출하기 위해 userdata를 사용하고 있습니다. 가벼운 userdata가 내가 가진 몇 가지 문제를 해결할 수 있는지 궁금합니다.루아의 가벼운 사용자 데이터를위한 사용 사례?

가벼운 userdata는 void *이지만, 루아에서는 아무 것도 할 수 없다. 최소한 내 이해는 어떻게해서든지 C에 전달할 수있다. 함수 호출로?

어떻게 가벼운 사용자 데이터를 사용합니까? 누구든지 유스 케이스를 사용했다면 그것들을 사용하여 유스 케이스를 잡을 수있을 것입니다.

TIA는

답변

3

나는 Programming In Lua 아주 잘 설명 생각 :

라이트 유저 데이터의 실제 사용은 평등에서 비롯됩니다. 전체 사용자 데이터는 객체이기 때문에 자체 사용자 데이터와 동일합니다. 반면에 light userdata는 C 포인터 값을 나타냅니다. 같은 포인터를 나타내는 모든 사용자 데이터와 같습니다. 따라서 Lua 내부의 C 객체를 찾기 위해 간단한 사용자 데이터를 사용할 수 있습니다.

대표적인 예로, 루아와 Window 시스템 사이에 바인딩을 구현한다고 가정합니다. 이 바인딩에서 우리는 에 대한 전체 사용자 데이터를 사용하여 창을 나타냅니다. 각 사용자 데이터에는 전체 창 구조체가 포함되거나 시스템에서 생성 된 창에 대한 포인터 만 포함될 수 있습니다. 창 내부에 이벤트 (예 : 마우스 클릭)가 있으면 시스템이 특정 콜백을 호출하여 창을 그 주소로 이 콜백을 루아에 전달하기 위해서는 주어진 창을 으로 나타내는 userdata를 찾아야 만합니다. 이 사용자 데이터를 찾으려면 색인이 창 주소와 함께 가벼운 사용자 데이터이고 값이 은 Lua의 창을 나타내는 전체 사용자 데이터입니다. 창 주소를 얻은 후에는 가벼운 사용자 데이터 으로 API 스택으로 푸시하고 userdata를 해당 테이블의 색인으로 사용합니다. (표 약한 값을 가지고 있어야합니다. 그렇지 않으면, 그 전체 유저 데이터가 을 결코 것 수집.)

이 페이지에는 빛 유저 데이터가 메모리 관리는 당신의 코드에 의해 수행되어야하므로 가비지 수집이 아니라고 설명한다. 실제로 유스 케이스가 실제로 제한되어 있으므로 많은 예제를 찾을 수없는 것 같습니다. 나는 one example 발견했다 :

나는 루아 테이블에서 GUI 객체 (트리 뷰)를 구성하는 루틴이있다. 그런 다음 각 트리 노드의 윈도우 핸들 에 의해 인덱싱 된 별도의 루아 테이블을 lightuserdata로 갖습니다. 이렇게하면 c/lua 인터페이스가 간단 해집니다. - c 핸들을 사용하여 적절한 lua 테이블 객체를 조회 할 수 있습니다.

// save a window handle 
lua_pushlightuserdata(L, hKey); 
lua_pushvalue(L,filt); // copy of filter table entry 
lua_settable(L, treeindex); 


// find data for a window handle 
lua_pushstring(L, "__treeitems"); 
lua_gettable(L, LUA_GLOBALSINDEX); 
lua_pushlightuserdata(L, hKey); 
lua_gettable(L, -2); 
+0

오, 고마워, 나는 뭔가를 놓친다 고 생각했다. – daven11

1

그들이 설정 한 API에 전달할 수있는 다른 응용 프로그램에 루아를 삽입 할 때 일반적인 사용 사례는, 당신은 (라이트 사용자 데이터의 형태로) 루아 저자 토큰을주고 싶어 쪽으로. 여기에 구체적인 예가 있습니다.(다음은이 getPerson의 반환 값을 취할 것입니다 귀하의 바인딩

GetPersonCount() // returns a number 
GetPerson(index) // returns a light user data - a pointer to the C++ version 

을 통해

이 당신이 '친구'에 대한 액세스 권한을 부여 할 객체를 :

는 사람과 친구 루아에서 다음과 같은 API를 제공하는 말 또는 GetFriend)를 인수로 사용합니다.

GetFirstName(person) 
GetLastName(person) 
GetFriendCount(person) 
GetFriend(person, index) // would also return user data like GetPerson 

이미 친구에 대한 정보를 얻기를위한 C++로 프로그램을 구축 한 경우에 유용 할 것이다, 그러나 당신이 할 수있는보다 단순하고 제한적인 인터페이스를 통해 루아에서 스크립트를 작성하는 사람들이 사용할 수 있도록 할 컴파일이나 소스 코드없이 런타임에 안전하게 액세스 할 수 있습니다.