使用 Lua 表 C API 创建一个简单的表

2024-02-03

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

row->name, row->date, row->ip, row->custom

我想要实现的是根据上述结果创建一个简单的表,因此它看起来像:

{
     "name" = result of row->name,
     "date" = result of row->date,
     "ip"   = result of row->ip,
     "custom" = result of 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);

正如我在评论中提到的,lua_settable() http://pgl.yoyo.org/luai/i/lua_settable只照顾一个key, value一对。如果您需要更多,必须重复一遍。

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

lua_createtable(L, 0, 4);

lua_pushstring(L, "name");
lua_pushstring(L, row->name);
lua_settable(L, -3);  /* 3rd element from the stack top */

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

/* We still have table left on top of the Lua stack. */

另外,您可以编写某种 C 结构迭代器或其他东西。

注意:如果这是某种 Lua 包装器 - 你应该确保这样做的标准化方法 http://www.lua.org/manual/5.1/manual.html#lua_CFunction。在下面的例子中应用了@lhf https://stackoverflow.com/users/107090/lhf关于缩短一点的评论:

int 
l_row_push(lua_State *l)
{
    lua_createtable(L, 0, 4); /* creates and pushes new table on top of Lua stack */

    lua_pushstring(L, row->name); /* Pushes table value on top of Lua stack */
    lua_setfield(L, -2, "name");  /* table["name"] = row->name. Pops key value */

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

    /* Returning one table which is already on top of Lua stack. */
    return 1;
}

编辑:修复了的使用lua_setfield() http://pgl.yoyo.org/luai/i/lua_setfield by @lhf https://stackoverflow.com/users/107090/lhf笔记。谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Lua 表 C API 创建一个简单的表 的相关文章

  • 异步提交或回滚事务范围

    正如许多人所知 TransactionScope当async await Net 中引入了模式 如果我们尝试使用一些它们就会损坏await在事务范围内调用 现在这个问题已经解决了 感谢范围构造函数选项 a 17527759 1178314
  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • Java 相当于 C# 的 async/await?

    我是一名普通的 C 开发人员 但偶尔也会使用 Java 开发应用程序 我想知道 Java 中是否有相当于 C async await 的东西 简单来说 java 相当于 async Task
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • 当假设 [[assume]] 包含 UB 时会发生什么?

    在 C 23 中 assume expression 属性使得如果表达 is false 行为未定义 例如 int div int x int y assume y 1 return x y 这会编译成相同的代码 就像y一直是1 div i
  • Web API 2 中的方法名称约定 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有 Web API 2 中使用的约定的列表 以这两种方法为例 两者都可以工作 但都没有用属性来装饰 IHttpActionResu
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 确定所选电子邮件是来自收件箱还是已发送邮件

    我正在编程Outlook 插件并需要确定所选电子邮件是否来自Inbox or Sent Items这样当我将电子邮件保存到数据库中时 我可以使用文件夹 收件箱 或 已发送 来标记电子邮件 我知道我可以将文件夹名称与 收件箱 或 已发送邮件
  • 以编程方式打开网页并以字符串形式检索其 html 包含内容

    我有一个 Facebook 帐户 我想提取我朋友的照片及其个人详细信息 例如 出生日期 就读学校 等 我能够提取我每个朋友帐户的 Facebook 首页的地址 但我不知道如何以编程方式打开我每个朋友首页的网页并将 html 包含保存为字符串
  • 寻找自定义 SynchronizationContext 的示例(单元测试所需)

    我需要定制同步上下文 http msdn microsoft com en us library system threading synchronizationcontext aspx that 拥有一个运行 Posts 和 Sends
  • MonoMac 窗口关闭时没有错误

    我刚刚开始在 Xamarin Studio 中使用 MonoMac 并且遇到了最奇怪的问题 我有一个带有 NSButton 和 NSTextField 的窗口 至此 我已经删除了按钮上的事件处理程序 因此它不会执行任何操作 除了在单击它时突
  • 如果未先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数

    我正在使用 NET4 5 和 VS2013 我有这个查询dynamic来自数据库的结果 dynamic topAgents this dataContext Sql select t create user id as User sum t
  • timeval_subtract 解释

    使用 timeval subtract 函数来查找两个 struct timeval 类型之间经过的时间 有人可以解释一下用于 通过更新 y 执行后续减法的进位 和其他部分的目的和逐步数学吗 我了解该函数的目的以及如何在程序中实现它 但我想
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?

    我有一个 ashx 处理程序 using System using System Web public class Thumbnail IHttpHandler public void ProcessRequest HttpContext
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 我的 Visual Studio 2008 模板有什么问题?

    我正在尝试为 Visual Studio 创建自己的类模板 称为 公共类 我跟着有关如何手动创建项目模板的官方 MSDN 说明 http msdn microsoft com en us library ms247113 aspx几乎一字不
  • 为什么删除void*是UB而不是编译错误?

    为什么要通过删除对象void 是未定义的行为 而不是编译错误 void foo void p delete p 这段代码编译并生成代码 尽管有关于 gcc 和 clang 的警告 令人惊讶的是 ICC 没有给出警告 2 5 warning
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们

随机推荐