使用 Lua 表格 C API 创建简单的表格

我正在运行一个MySQL查询,它总是返回4行:

row->namerow->daterow->iprow->custom

我想实现的是根据上面的结果创建一个简单的表格,看起来像这样:

{
     "name" = row->name的结果,
     "date" = row->date的结果,
     "ip"   = row->ip的结果,
     "custom" = row->custom的结果
}

我尝试了多个可能性,但发布的示例真的非常不同,我在让它工作时遇到了问题。

我的最后一次不成功的尝试:

lua_createtable(L, 0, 4);
top = lua_gettop(L);
lua_pushstring(L, "name");
lua_pushstring(L, row->name);
lua_pushstring(L, "date");
lua_pushnumber(L, row->date);
lua_pushstring(L, "ip");
lua_pushstring(L, row->ip);
lua_pushstring(L, "custom");
lua_pushstring(L, row->custom);
lua_settable(L, top);
点赞
用户1150918
用户1150918

正如我在评论中提到的那样,lua_settable() 仅处理一个key, value对。如果需要更多,必须重复。

我更喜欢像这样保存 Lua 堆栈空间:

lua_createtable(L, 0, 4);

lua_pushstring(L, "name");
lua_pushstring(L, row->name);
lua_settable(L, -3);  /* 从栈顶开始算,第三个元素 */

lua_pushstring(L, "date");
lua_pushstring(L, row->date);
lua_settable(L, -3);

lua_pushstring(L, "ip");
lua_pushstring(L, row->ip);
lua_settable(L, -3);

lua_pushstring(L, "custom");
lua_pushstring(L, row->custom);
lua_settable(L, -3);

/* 这时 Lua 栈顶还是一个表。 */

此外,你可以编写某种类型的 C 结构迭代器之类的东西。

注意:如果这是用于某种 Lua 包装器 - 你应该确保标准化方式。在下面的示例中,应用了@lhf的评论,有点简化:

int
l_row_push(lua_State *l)
{
    lua_createtable(L, 0, 4); /* 创建并将新表推送到 Lua 堆栈顶部 */

    lua_pushstring(L, row->name); /* 将表值推送到 Lua 堆栈顶部 */
    lua_setfield(L, -2, "name");  /* table["name"] = row->name。弹出键值 */

    lua_pushstring(L, row->date);
    lua_setfield(L, -2, "date");

    lua_pushstring(L, row->ip);
    lua_setfield(L, -2, "ip");

    lua_pushstring(L, row->custom);
    lua_setfield(L, -2, "custom");

    /* 返回一个已在 Lua 堆栈顶部的表。 */
    return 1;
}

编辑:修正了@lhf关于 lua_setfield() 的用法。感谢!

2013-11-22 15:08:14