C /LUA FFI将用户数据作为表格

C++/Lua FFI to render userdata as a table?

本文关键字:数据 表格 用户数 用户 LUA FFI      更新时间:2023-10-16

我在c 中具有以下简单代码,其中对象是一个std容器:

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");

使用上面的FFI,我可以在LUA中实现对象的索引,例如:

local obj = create_an_object()
print(obj.foo)   -- 123

同时print(obj)表明OBJ是userdata: 0x12345678

是否可以使用一些metamethod魔术,以便 obj可以用作表,而print(obj.foo)仍然打印123?我正在LUA 5.1中运行代码。

我不确定您的意思是"可以用作表",但是如果您想打印与print(obj)默认值不同的内容,那么您将需要分配__tostring MetAmethod并从中返回一些字符串。如果需要的话,此字符串可能看起来像"userdata: 0x12345678 = {foo = 123}"(或简单的"{foo = 123}")。

如果您在为其分配新索引时将其作为表工作,则应使用__newindex metAmethod。