c++ - 相同用户数据的 Lua 数组和面向对象访问

标签 c++ lua

我有一个用 C++ 编写的 CArray 类,并作为数组公开给 Lua。

1) 创建一个新的用户数据:

int Array_new(lua_State* L)
{
    int len = luaL_checkint(L, 1);
    CArray<std::string> **Arr = (CArray<std::string>**)lua_newuserdata(L, sizeof(CArray<std::string>*));
    *Arr = new CArray<std::string>(len);
    luaL_getmetatable(L, "ArrayMetatable");
    lua_setmetatable(L, -2);

    return 1;
}

2) 访问一个元素:

int Array_getValue(lua_State* L)
{
    CArray<std::string>* arr = *(CArray<std::string>**)lua_touserdata(L, 1);
    int pos=luaL_checknumber(L, 2)-1;

    //Omitted for brevity
    lua_pushstring(L, stdStr.c_str());

    return 1;
}

3)注册到Lua:

int luaopen_Array(lua_State* L)
{
    luaL_newmetatable(L, "ArrayMetatable"); // metatable1

    luaL_setfuncs(L, Array_metatable, 0);
    lua_pushstring(L, "__index");
    lua_pushvalue(L, -2);  //  metatable1 __index metatable1
    lua_settable(L, -3); // metatable1[__index]=metatable1

    /*luaL_newmetatable(L, "ArrayMetatable_2"); //  metatable1 metatable2
    lua_pushstring(L, "__index"); //  metatable1 metatable2 __index
    lua_pushstring(L, "get"); //  metatable1 metatable2 __index get
    lua_gettable(L, 1);  //  metatable1 metatable2 __index
    lua_settable(L, 2);  

    lua_pushvalue(L, 1); //metatable1 metatable2 metatable1*/

    lua_setglobal(L, "Array");

    return 0;
}

问题是我必须选择 Lua 代码来访问数组中的元素:a) arr:get(1)获取第一个元素,b) arr[1]得到第一个元素。

但是 ab 不能同时工作,所以我必须更喜欢 style astyle b 。修改第3步是否可以同时做ab

到目前为止,如果我尝试使用 arr[2] 等 Lua 表达式,我提供的代码会在第 2 步 出现错误这样变量 arr的地址是0xcccccc。

最佳答案

可以添加一个__index方法和一个get方法,分开添加即可。

关于c++ - 相同用户数据的 Lua 数组和面向对象访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870449/

相关文章:

c++ - WCHAR 类型的参数与 const char* 类型的参数不兼容

c++ - 将自身存储在模板类中的 std::vector

c++ - 这是否可以赎回线程安全的双重检查锁定模式?

c++ - 使用信号处理程序处理从 fifo 接收的数据

lua - 计算字符串出现的次数

c - luajit在Windows mingw64上编译lua-lzma

c++ - luabind 什么时候释放创建的对象?

c++ - 缺少模板参数或预期的主表达式

redis - 如何将 "\""(双引号)从 lua 输出到控制台?

configuration - 更新 aerospike 中所有记录的 ttl