I 개체는 표준 컨테이너 인 C의 다음 간단한 코드 ++ 가지고C++/루아 FFI로 userdata를 테이블로 렌더링 하시겠습니까?
local obj = create_an_object()
print(obj.foo) -- 123
한편 print(obj)
보여준다 I 같은 루아 객체의 인덱스를 얻을 수 위 FFI와
static int create_an_object(lua_State* L) {
auto obj = static_cast<Object*>(lua_newuserdata(L, sizeof(Object*)));
*obj = another_valid_obj;
luaL_newmetatable(L, "object_metatable");
lua_pushcfunction(L, object_metatable_function);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
return 1;
}
static int object_metatable_function(lua_State* L) {
string index = luaL_checkstring(L, -1);
if (index == "foo") {
lua_pushnumber(L, 123);
}
// Handles other indices, or throws error.
}
lua_pushcfunction(L, create_an_object);
lua_setglobal(L, "create_an_object");
을 obj는 userdata: 0x12345678
입니다.
print(obj.foo)
은 여전히 123을 인쇄하지만 obj
이 테이블로 사용될 수 있도록 일부 메타 메서드 마법을 사용할 수 있습니까? 루아 5.1에서 코드를 실행하고 있습니다.
이 사용자 데이터에 대한 색인, ipair/pair 반복 및 getlen (#)을 포함하는 작업을 지원하고 싶습니다. – TangKe
이것을 달성하기 위해'__pairs' /'__ipairs' 메타 메소드 (Lua 5.2+)와 ['__len' 메타 메소드 (https://www.lua.org/manual/5.2/manual.html#3.4.6))를 사용할 수 있습니다 . –
그래, 5.2.x에서 실행 가능하다는 것을 알고 있지만 5.1 만 사용할 수있다. ( – TangKe