나는 루아에 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.html 및 https://www.lua.org/pil/14.2.html을 참조하십시오. 특히 내 변수는 전역 변수가 아닌 함수 인수이므로 C API를 통해 전역 변수로 변환하면 할당이 전역 사용자 데이터에 발생하는 경우 조치를 취할 사용자 정의 C 함수가 모든 할당을 캡처 할 수 있습니까?
그건 그렇고, 내 userdata는 큰 개체를 복제하지 않도록 개체에 대한 포인터입니다.
질문의 목표는 루아를 사용자에게 친숙하게 만드는 것입니다. 그리고 내가 말했듯이 퍼즐에 남은 부분은 하나뿐입니다. C의 함수 인수를 현재 Lua 컨텍스트의 전역 변수 metatable에 추가하는 것입니다. 나는 이것이 가능하다고 믿지만 광범위하게 다른 응용 프로그램에 흩어져있는 다양한 구성 요소 만 보았 기 때문에 함께 모으려고합니다. 가능하지 않다면 예, 라이브러리에서 assign()을 선언하거나 "__self"와 같은 사용자 정의 색인을 사용하는 것과 같은 작업을 수행합니다 ... – Leo
@Leo : "* 질문의 목표는 Lua 사용자 - 친한 * "하지만 루아 *는 이미"사용자에게 친숙한 "것입니다. 그것이 아닌 것은 "C/C++와 정확히 동일합니다"입니다. 함수 매개 변수를 일종의 전역 변수로 전달하고 함수에서 검색하려는 경우 할 수 있습니다. 그러나 루아에서 그들은 함수 인자처럼 보이지 않을 것입니다. 그리고 그것은 여전히 임의의'local' 변수가 이것에 참여할 수 없다는 사실을 바꾸지 않습니다. –