2016-08-16 4 views
3

나는 루아에 userdata로 전달하는 객체를 C++ 프로그램에 가지고 있으며,이 사용자 데이터에 대한 메타 테이블을 오버라이드하여 __newindex 및 __index를 통해 객체의 인덱스에 할당하고, C를 호출하여 C++ 객체에 영향을주는 할당을 변환하거나 C++ 요소를 루아 값 (다른 사용자 데이터 또는 bool, number, string과 같은 기본 유형)으로 변환합니다. userdata는 내 C++ 프로그램에서 호출되는 이벤트와 같은 루아 함수에 인수로 전달됩니다.C API를 사용하여 루아에서 할당 연산자를 재정의

luaL_newmetatable(L, "object"); 
lua_pushstring(L, "__index"); 
lua_pushvalue(L, -2); /* pushes the metatable */ 
lua_settable(L, -3); /* metatable.__index = metatable */ 

luaL_openlib(L, NULL, vallib_m, 0); 
luaL_openlib(L, "internal", vallib_f, 0); 

lua_pushstring(L, "__index"); 
lua_pushstring(L, "get"); 
lua_gettable(L, 2); /* get val.get */ 
lua_settable(L, 1); /* metatable.__index = val.get */ 

lua_pushstring(L, "__newindex"); 
lua_pushstring(L, "set"); 
lua_gettable(L, 2); /* get array.set */ 
lua_settable(L, 1); /* metatable.__newindex = val.set */ 

그러나,이 날 실제 변수 자체 변수의 인덱스를 할당 할 수 없습니다. 할당 연산자를 직접 재정의하는 메타 이벤트가 없으므로 해결 방법을 찾고 있습니다. lua_userdata_object_passed_as_arg_to_event["is_it_true"]=true 을 그리고 루아 나의 내부 C++ 객체 부울 할당하지만 내가 할 경우이 : 즉

,이 작업을 수행 할 수 있습니다 는 lua_userdata_object_passed_as_arg_to_event = new_object() 그것은 어떤 루아 변수 참조가 변경됩니다,하지만하지 않습니다 내가 이해하는 핵심 물체에 무엇이든하십시오.

해결 방법 한 가지 해결 방법은 개발자가 객체 자체를 변경하려는 경우 lua_userdata_object_passed_as_arg_to_event["__self"] = new_object() 을 수행하도록 요청하는 해킹입니다.하지만 바람직하지 않습니다.

전역 변수를 사용하고 전역 metatable 할당 연산자를 재정 의하여 할당 연산자를 재정의하는 몇 가지 고유 솔루션을 찾았지만 아무도 내가이 솔루션을 설명하는 데 도움이되는지 확인하려고합니다. http://lua-users.org/lists/lua-l/2012-01/msg00413.htmlhttps://www.lua.org/pil/14.2.html을 참조하십시오. 특히 내 변수는 전역 변수가 아닌 함수 인수이므로 C API를 통해 전역 변수로 변환하면 할당이 전역 사용자 데이터에 발생하는 경우 조치를 취할 사용자 정의 C 함수가 모든 할당을 캡처 할 수 있습니까?

그건 그렇고, 내 userdata는 큰 개체를 복제하지 않도록 개체에 대한 포인터입니다.

답변

3

루아와 C/C++는 필요에 따라 다른 언어입니다. C/C++에서 변수는 항상 특정 개체을 참조합니다. 이 객체의 내용을 변경할 수는 있지만 다른 객체로 변수를 처리 할 수는 없습니다. a = b;을 수행하는 경우 b 값을 a에 복사합니다. a이 말하는 대상을 절대 변경할 수 없습니다.

루아에서 변수는 으로 영구히을 참조하지 않습니다. 따라서 변수가 현재 보유하고있는 객체와 해당 객체의 값 사이에는 구분이 있습니다.

전역 변수 함수를 통해 귀하의 kludge,하지만 local 변수는 실제로 존재하지 않는 것들입니다. 루아 스택의 위치입니다. 루아의 기본 동작을 무시할 수는 없습니다.

가장 좋은 방법은 C와 루아의 차이를 허용하는 것입니다. 루아에서 코드를 작성하는 방식으로 루아에서 코드를 작성하십시오. Lua 코드를 C와 같이 작동 시키려고하지 마십시오. 그런 식으로 어리 석다. 그들은 서로 다른 언어를 사용하기 때문에 차이점을 받아 들여야합니다.

a = b에 해당하는 기능을 Lua에 제공하려면 유형에 assign 등의 함수를 만들어야합니다.이 함수를 사용하면 객체 값에 할당 할 수 있습니다.하나의 테이블에서 다른 테이블로 모든 테이블 요소를 복사하려는 경우, 그렇게하기위한 함수를 작성해야합니다.

+0

질문의 목표는 루아를 사용자에게 친숙하게 만드는 것입니다. 그리고 내가 말했듯이 퍼즐에 남은 부분은 하나뿐입니다. C의 함수 인수를 현재 Lua 컨텍스트의 전역 변수 metatable에 추가하는 것입니다. 나는 이것이 가능하다고 믿지만 광범위하게 다른 응용 프로그램에 흩어져있는 다양한 구성 요소 만 보았 기 때문에 함께 모으려고합니다. 가능하지 않다면 예, 라이브러리에서 assign()을 선언하거나 "__self"와 같은 사용자 정의 색인을 사용하는 것과 같은 작업을 수행합니다 ... – Leo

+0

@Leo : "* 질문의 목표는 Lua 사용자 - 친한 * "하지만 루아 *는 이미"사용자에게 친숙한 "것입니다. 그것이 아닌 것은 "C/C++와 정확히 동일합니다"입니다. 함수 매개 변수를 일종의 전역 변수로 전달하고 함수에서 검색하려는 경우 할 수 있습니다. 그러나 루아에서 그들은 함수 인자처럼 보이지 않을 것입니다. 그리고 그것은 여전히 ​​임의의'local' 변수가 이것에 참여할 수 없다는 사실을 바꾸지 않습니다. –

관련 문제