lua知识点整理
1. lua全局环境和局部环境
local cf = loadstring(" local i=0 i=i+1 print(i) ")
--从后面两个输出我们可以看出,生成的函数的环境就是全局_G
print(cf,getfenv(cf),_G) -- function: 0058AAB0 table: 00582ED8 table: 00582ED
--改变_G的值
_G = {}
cf() --
--虽然改变了_G的值,但函数的的环境仍然是全局环境table,地址仍然是0058AAB0
print(cf,getfenv(cf),_G) -- function: 0058AAB0 table: 00582ED8 table: 0058BFF0
-- function: 0058AAB0 table: 00582ED8 table: 00582ED8
--
-- function: 0058AAB0 table: 00582ED8 table: 0058BFF0
-- [Finished in 0.1s]
-- -- 用局部变量list模拟_G(用list表的元素_A保存list表自身,为什么这样做??)
-- local list = {_A = "ddddd", _B = "bbbbb", _C = "ccccc",}
-- list._A = list
-- -- print(list)
-- -- print(list._A)
-- -- print(list._A._A) -- 类似:_G._G = _G -- for k, v in pairs(list) do
-- -- print(k, "=", v, type(v))
-- end -------------------------------------------------------
-- 搜索:局部变量 -> 全局变量 -> 环境
-- 用局部变量 _A 模拟_G(用list表的元素_A保存list表自身,为什么这样做??)
local _A = {_A = "ddddd", _B = "bbbbb", _C = "ccccc",}
_A._A = _A
print(_A)
print(_A._A) -- 类似:_G._G = _G
print(_A._A._A) for k, v in pairs(_A) do
print(k, "=", v, type(v))
end -- output --
-- table: 004FBFF0
-- table: 004FBFF0
-- table: 004FBFF0
-- _A = table: 004FBFF0 table
-- _C = ccccc string
-- _B = bbbbb string
-- [Finished in 0.1s]
[参见]
http://blog.sina.com.cn/s/blog_4458fdda01012f4b.html
http://www.tuicool.com/articles/RVZvMbn
http://blog.csdn.net/maximuszhou/article/details/24105673?utm_source=tuicool
http://blog.csdn.net/ball32109/article/details/11402727
http://blog.codingnow.com/2011/12/lua_52_env.html
http://www.cnblogs.com/ringofthec/archive/2010/11/09/lua_State.html
--------------------------------------------------------------------------------------------------
2. C中遍历lua表结构
// 进行下面步骤前先将 table 压入栈顶
int nIndex = lua_gettop( pLua ); // 取 table 索引值
lua_pushnil( pLua ); // nil 入栈作为初始 key
while( != lua_next( pLua, nIndex ) )
{
// 现在栈顶(-1)是 value,-2 位置是对应的 key
// 这里可以判断 key 是什么并且对 value 进行各种处理
lua_pop( pLua, ); // 弹出 value,让 key 留在栈顶
}
// 现在栈顶是 table
lua_next() 这个函数的工作过程是:
1) 先从栈顶弹出一个 key(这也是为什么需要首先压入一个nil (lua_pushnil(pLua)) ) .
2) 从栈指定位置的 table 里取下一对 key-value,先将 key 入栈再将 value 入栈
3) 如果第 2 步成功则返回非 0 值,否则返回 0,并且不向栈中压入任何值
第 2 步中从 table 里取出所谓“下一对 key-value”是相对于第 1 步中弹出的 key 的。table 里第一对 key-value 的前面没有数据,所以先用 lua_pushnil() 压入一个 nil 充当初始 key。
注意:
开始的时候先用 lua_gettop() 取了一下 table 在栈中的正索引(前面说过了,在进行这个 lua_next() 过程之前先将 table 入栈,所以栈大小就是 table 的正索引),后面的 lua_next() 过程中不断的有元素出入栈,所以使用正索引来定位 table 比较方便。
到了 table 中已经没有 key-value 对时,lua_next() 先弹出最后一个 key,然后发现已经没有数据了会返回 0,while 循环结束。所以这个 lua_next() 过程结束以后 table 就又位于栈顶了。
问题概要: 用lua写了个函数,返回的是一个表.需要在C里对返回的表里元素做二次处理. 在C里我们可以通过lua_gettable()或者lua_rawget()来获取表里元素值,但使用这两个接口的前提是你得知道key,它才能给你 value. 当然对于顺序下标倒无所谓,但恰巧这次我用到的是关联数组,下标是无规则字符串.这时候如何遍历出表里元素就是个问题. lua_next()就成了比较合适的选择.
上图对简单的表遍历做了介绍, 但事实上的情况是我返回了一个二维表,如果你了解了lua_next()的处理过程,那下面的代码看起来就没什么问题了.
t_idx = lua_gettop(L);
lua_pushnil(L);
while (lua_next(L, t_idx))
{
printf("============================\n");
it_idx = lua_gettop(L);
lua_pushnil(L);
while(lua_next(L, it_idx))
{
printf("%s\n", lua_tostring(L, -));
lua_pop(L, );
}
lua_pop(L, );
}
lua知识点整理的更多相关文章
- ACM个人零散知识点整理
ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...
- Android 零散知识点整理
Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...
- vue前端面试题知识点整理
vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...
- kafka知识点整理总结
kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...
- JSP页面开发知识点整理
刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...
- JS知识点整理(二)
前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...
- css入门知识点整理
css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...
- activity生命周期知识点整理
activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...
- 【Android 面试基础知识点整理】
针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...
随机推荐
- iOS网络NSURLSession使用详解
一.整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台.现在使用 ...
- 【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)
首先是工具的下载地址: 动软.Net代码生成器 该工具官网自带完整教程: 文档:http://www.maticsoft.com/help/ 例子:http://www.maticsoft.com/h ...
- 设计和开发ETL系统(二)——启动
在针对某个维度模型开始ETL系统设计之前,应当完成逻辑设计,草拟高层架构计划,并且为所有的数据元素拟定源到目标映射. ETL的设计过程十分重要: 收集所有的相关信息,包括事物处理系统中所允许的提取处理 ...
- java资料——链表(转)
链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个 ...
- ubuntu如何修改字符集编码
系统支持编码的修改如下: 1. 使用如下命令查看系统支持的字符集cat /usr/share/i18n/SUPPORTED说明:查看系统支持的字符集,你需要注意的是支持字符集的格式,如对中文会有以下一 ...
- brew install mac安装失败的问题
问题:brew 安装失败思路:将github仓库放到本地,不用ruby下载解决办法:1.下载https://raw.githubusercontent.com/Homebrew/install/mas ...
- 执行sql出现No Dialect mapping for JDBC type: -9错误
name的数据类型是nvarchar吗?如果是改为varchar类型应该能运行,但是这个治标不治本,这是hibernate没映射nvarchar 刚才整理了一下varchar和nvarchar的区别, ...
- 关于Nginx里面的配置文件里面的location参数的意思
location是指当遇到这个单词的时候,把root改成大括号里面的值,再把单词和后面的路径加上root变成总的文件路径进行搜索,如果没有location,直接把root加上域名后面的路径变成总的文件 ...
- Jquery实现选项卡功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- php date strtotime的用法
1.上个月第一天及最后一天. echo date('Y-m-01', strtotime('-1 month')); echo strtotime(date('Y-m-01 0:00:00', str ...