前情提要

Lua 通过一个虚拟栈与 C 的交互,正数索引自底向上取值,负数索引自顶向下取值。

Lua 中的 Table(表)结构可以使用任何数据作为 key 进行取值。使用 C API 访问 Table 中的元素有两种方法:

lua_getglobal(L, t);
lua_pushinteger(L, k); -- 这里可以换成其它类型的 lua_pushXXXX(L, k) 压数据到栈顶作key
lua_gettable(L, -2);
lua_getglobal(L, t);
lua_getfield(L, -1, k);

在结束时,栈上的情况均为:栈顶为 t[k],次顶元素为 Table 类型的 t。第二种方法其实是第一种方法在「key 为字符串」时的特殊写法。

C API 遍历 Table

lua_getglobal(L, t);
lua_pushnil(L);
while (lua_next(L, -2)) {/* 此时栈上 -1 处为 value, -2 处为 key */lua_pop(L, 1);
}

lua_next 函数针对 -2 处(参数指定)的 Table 进行遍历。弹出 -1 处(栈顶)的值作为上一个 key(为 nil 时视为请求首个 key),压入 Table 中的下一个 key 和 value。返回值表示是否存在下一个 key。

另外在循环中处理值时要记得随时清理栈,否则 Table 就不在 -2 了。(也可以考虑在 lua_getglobal 后用lua_gettop 存下 Table 的正数索引。)

虽然这是手册中记载的遍历方法,但这种方法在遍历时并没有一定的遍历顺序,于是便又有了下面的方法。

用整数 Key 进行并不那么完美的遍历

lua_getglobal(L, t);
len = lua_objlen(L, -1);
for (i = 1; i <= len; i++) {lua_pushinteger(L, i);lua_gettable(L, -2);/* 此时栈顶即为 t[i] 元素 */lua_pop(L, 1);
}

这种方法无视了非整数 key,但可以保证遍历顺序。如果只关注整数 key,可以考虑用这种遍历方法 :)

Lua 学习笔记:C API 遍历 Table相关推荐

  1. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  4. Lua学习笔记6:C++和Lua的相互调用

    曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...

  5. python学习笔记 os.scandir遍历目录

    python学习笔记 os.scandir遍历目录 之前尝试用os.walk进行遍历目录,前几天看有人说os.scandir比walk更高效,尝试了一下,写了两端代码,做了一个测试 第一段用walk也 ...

  6. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  7. java 反射api_Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计思路,一 ...

  8. Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

    1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...

  9. Lua学习笔记--table

    Lua只有一种数据结构,叫table.但是他灰常强大,足以满足我们一般的要求,而且可以根据table做出其他的效果. 一.简介 table类型实际上是一种关联数组,是一种具有特殊索引方式的数组,不仅可 ...

最新文章

  1. 南洋理工75页最新「深度学习对话系统」大综述论文,最全面概述深度学习对话技术进展...
  2. Can‘t pickle local object ‘get_transforms.<locals>.process‘
  3. 花式看超级碗 人工智能、大数据在碗里
  4. Springcloud整理
  5. 用 npm script 实现服务自动化运维
  6. 算法不会,尚能饭否之栈
  7. [置顶] Android之Handler用法总结
  8. 【车辆分类】基于matlab的视频中车辆跟踪监测分类算法仿真,包括背景差分与帧间差分以及形态学处理
  9. iOS 常见的URL Schemes
  10. PHP爬虫最全总结 -phpQuery,PHPcrawer,snoopy框架中文介绍
  11. 动态生成icon图标
  12. 记录CheckBook状态:SharedPreferences存储器
  13. 基于大数据平台分析前程无忧大数据招聘信息实现数据可视化
  14. 用ruby实现latex自动编译
  15. android 多个按键精灵,给大家分享一个,按键精灵安卓版,找多图, 以及找多图返回多个坐标的,相信大家绝对用得到 _ 按键精灵手机版 - 按键精灵论坛...
  16. 电脑服务器修改穿越火线不卡,windows10玩穿越火线画面不流畅怎么办
  17. 分号的html文本,在Vue中利用v-HTML按分号将文本换行的例子_輕微_前端开发者
  18. BUUCTF-RSA学习(一)
  19. NR RLC Protocol General and Procedure
  20. 程序员应了解的那些事(4)求递归算法的时间复杂度

热门文章

  1. 阿里云网盘公测_阿里云网盘开启公测预约!不限速,2T永久免费!!硬刚百度网盘~...
  2. html怎么去掉下拉条,如何清除下拉列表中的边框:CSS
  3. 一招教你如何在30天内提高销售额,这样的装修公司才能赚大钱
  4. react的单页面应用SPA及路由组件
  5. golang实现一个linux命令ls命令(命令行工具构建)
  6. n个小孩围成一圈,顺序报号,从第一个人开始报数(从1报到5),凡是报到5的人退出圈子,问最后留下的小孩原来是几号
  7. 人工智能:智能家居安全控制系统的未来:基于人工智能的自适应技术
  8. asp版茶叶礼品卡券、海鲜礼品卡券、大闸蟹礼品卡券、龙虾礼品卡券-提货系统-生成卡密源码
  9. 这就是巨人的肩膀!2018年阿里巴巴开源的那些牛逼项目汇总
  10. python人脸识别和人脸对比,face_recognition和OpenCV