【lua学习】2.数据类型

  • Lua中的数据类型
  • 关于TValue自顶向下分析
    • TValue表示所有的Lua数据结构并带一个类型字段
    • Value表示所有的Lua数据结构
    • GCObject表示所有需要进行垃圾回收的数据结构
    • GCheader表示需要GC的数据结构最开始的部分

Lua中的数据类型

宏名 (见lua.h) 宏值 类型 对应数据结构
LUA_TNONE -1 无类型
LUA_TNIL 0 空类型
LUA_TBOOLEAN 1 布尔类型
LUA_TLIGHTUSERDATA 2 指针 void*
LUA_TNUMBER 3 数字 lua_Number
LUA_TSTRING 4 字符串 TString
LUA_TTABLE 5 Table
LUA_TFUNCTION 6 函数 CClosure,LClosure
LUA_TUSERDATA 7 指针 void*
LUA_TTHREAD 8 lua虚拟机,协程 lua_State

关于TValue自顶向下分析

TValue表示所有的Lua数据结构并带一个类型字段

(lobject.h) TValue

typedef struct lua_TValue {TValuefields;
} TValue;

(lobject.h) TValuefields

//Value就是一个可以代表任何值类型的union
//上述宏定义中,tt表示类型,也就是上面表格列举的宏
#define TValuefields Value value;int tt

Value表示所有的Lua数据结构

(lobject.h) Value

typedef union {GCObject* gc;//存需要gc类型的值void* p;//存lightuserdata类型的值lua_Number n;//存数字类型的值int b;//存boolean类型的值
} Value;

GCObject表示所有需要进行垃圾回收的数据结构

(lstate.h) GCObject

union GCObject {GCHeader gch;//看下面定义union TString ts;//LUA_TSTRING 4union Udata u;//LUA_TUSERDATA 7union Closure cl;//LUA_TFUNCTION 6struct Table h;//LUA_TTABLE 5struct Proto p;struct UpVal uv;struct lua_State th;//LUA_TTHREAD 8
};

GCheader表示需要GC的数据结构最开始的部分

(lobject.h) GCheader

typedef struct GCheader {CommonHeader;//看下文
} GCheader;

(lobject.h) CommonHeader

//任何和需要进行垃圾回收的Lua对象,必然以CommonHeader为最开始的部分
//next 指向下一个GC链表的成员,todo 后面再说
//tt 表示的数据类型,也就是开始表格定义的宏
//marked GC相关的标记为,todo 后面再说
#define CommonHeader GCObject* next; lu_byte tt; lu_byte marked

(lobject.h) gcvalue宏 获取对象的gc部分

//check_exp看下文
//iscollectable看下文
#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc))

(llimits.h) check_exp 条件成了才展开宏

//不判断c的条件,直接展开宏e
#define check_exp(c,e) (e)

(lobject.h) iscollectable

//判断一个对象是否需要GC,只需要获得其类型宏值>=字符串即可
#define iscollectable(o) (ttype(o)>=LUA_TSTRING)
//ttype看下文

(lobject.h) ttype

//看ttype
//获取一个对象的类型
#define ttype(o) ((o)->tt)

【lua学习】2.数据类型相关推荐

  1. Lua学习篇③——数据类型

    学过C\C++.C#等主流编程语言的人都清楚,这些语言中对数据类型都有明确的定义,整型必须定义为int.字符串必须定义为string等.而Lua对变量类型的定义是动态的,也就是说对于一个变量,我们不需 ...

  2. Python 和 Lua 学习比较 一

    好记性不如烂笔头. 作的笔记以后也能来再看看. python有多种语言写成的版本,这里只记录C/C++写的版本,lua本身是使用标准C/C++编写的. 所以各位同学知道C的强大了吧,我觉得作为程序员, ...

  3. 从Lua学习JavaScript(一)

    学习 Lua 对于了解 Javascript 的人来说就是小菜一碟,Tyler Neylon 写了三篇文章来解释其中的原因,这是其中的第一篇. 这是通过 Javascript 来学习 Lua 系列文章 ...

  4. Lua语言基础入门 (Lua学习一)

    Lua语言快速入门 这篇博客主要是简单的讲解一下Lua的基础知识,涉及的东西不是很深,提供一些学习的思路,对具体的技术不展开介绍,网上资料很多写的都比我好,仅仅为了使用Lua,而不是做基于Lua的项目 ...

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

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

  6. Redis学习笔记 - 数据类型与API(1)Key

    Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令 含义 时间复杂度 keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 k ...

  7. lua学习:使用Lua处理游戏数据

    在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件. 其实lua在游戏开发中可以作为一个强大的保存.载入游戏数据的工具. 1.载入游戏数据 比如说,现在我有一份表单: data.xls ...

  8. Lua学习笔记(2)

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

  9. Lua 学习笔记(一)

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

最新文章

  1. 为treeview添加客户端事件
  2. Chrome浏览器取代火狐的十大理由
  3. sql server 判断是否存在数据库,表,列,视图
  4. boost::mpl模块实现empty相关的测试程序
  5. 解析PHP实现多进程并行执行脚本
  6. 7 个让您需要渐进式 Web 应用程序做项目开发的理由
  7. postgresql的特点_PG:PostgreSQL的一些简单操作
  8. Java基础知识——Sting、StringBuild、StringBuffer的区别
  9. (计算机显示器主屏幕区域)桌面造句,部编版《语文园地四》教学反思模板(11页)-原创力文档...
  10. js库编写的环境和准备工作
  11. java定时任务Quartz整理
  12. vant 个人中心头像修改
  13. PHP连接msSQL数据库方法
  14. 【MindSpore易点通】一站式指南
  15. jsdroid 教程_电气设计编程视频教程,涉及PLC、电气绘图、仿真等共400多份资料...
  16. 本人常用软件(工具)
  17. 如何判断如何判断RS232线是直连还是交叉连线
  18. 一文读懂keepalive的工作原理
  19. 机器视觉系列(三)——电气部分
  20. 搭建个人博客工具推荐

热门文章

  1. Java 11功能– Java飞行记录器
  2. JEP 181不兼容,嵌套类/ 2
  3. 使用Payara Micro的Easy Java EE Microservices
  4. jsf绑定bean_JSF –渴望的CDI bean
  5. 微基准测试进入Java 9
  6. 类固醇上的Java:5种超级有用的JIT优化技术
  7. 基于jsf的项目_JSF基于事件的交流:新派方法
  8. 2016年将是Java终于拥有窗口函数的那一年!
  9. java避免空指针异常_避免Java中的空指针异常
  10. 通过Spring将AWS SQS用作JMS提供程序