2017-11-21 1 views
3

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에서 코드를 실행하고 있습니다.

답변

0

"테이블로 사용할 수 있음"이 무엇인지 확실하지 않지만 기본값 인 print(obj)과 다른 것을 인쇄하려면 __tostring metamethod을 지정하고에서 일부 문자열을 반환해야합니다. 그것. 원할 경우이 문자열은 "userdata: 0x12345678 = {foo = 123}" (또는 간단히 "{foo = 123}")처럼 보일 수 있습니다.

새 색인을 할당 할 때 테이블로 작동하도록하려면 __newindex metamethod을 사용해야합니다.

+0

이 사용자 데이터에 대한 색인, ipair/pair 반복 및 getlen (#)을 포함하는 작업을 지원하고 싶습니다. – TangKe

+0

이것을 달성하기 위해'__pairs' /'__ipairs' 메타 메소드 (Lua 5.2+)와 ['__len' 메타 메소드 (https://www.lua.org/manual/5.2/manual.html#3.4.6))를 사용할 수 있습니다 . –

+0

그래, 5.2.x에서 실행 가능하다는 것을 알고 있지만 5.1 만 사용할 수있다. ( – TangKe

관련 문제