Lua数据结构设计确定了这个整体的设计理念,Lua所有的数据,一共有9种,都是通过TValue这个结构来存储。Lua的9种基础的数据类型有(lua.h:73):
/*
** basic types
*/
#define LUA_TNONE (-1)
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2
#define LUA_TNUMBER 3
#define LUA_TSTRING 4
#define LUA_TTABLE 5
#define LUA_TFUNCTION 6
#define LUA_TUSERDATA 7
#define LUA_TTHREAD 8
其中, LUA_TNONE表示不是任何的一种类型
TValue这个结构体,对应表达这9个类型是根据TValuefields来区分:
(lobject.h:107)
typedef struct lua_TValue TValue;
(lobject.h:400)
struct lua_TValue {
TValuefields;
};
具体TValuefields的宏定义如下:
(lobject.h:105)
#define TValuefields Value value_; int tt_
TValuefields有两个字段:
Value:存储具体数据的值
tt_:表示这个值的类型,即所有的基础数据类型
在Value的结构里面,一个结构里分别用多个字段存储具体的数据
(lobject.h:391)
union Value {
GCObject *gc; /* collectable objects */
void *p; /* light userdata */
int b; /* booleans */
lua_CFunction f; /* light C functions */
numfield /* numbers */
};
GCObject *gc | LUA_TSTRING、LUA_TUSERDATA、LUA_TTABLE、LUA_TTHREAD、LUA_TFUNCTION |
void *p | LUA_TLIGHTUSERDATA |
int b | LUA_TBOOLEAN |
numfield | LUA_TNUMBER |
其中:void *p,int b,numfield都不会由GC机制回收,GCObject *gc代表需要由GC机制回收的字段;
由于有GC回收机制,名字比较相似的userdata和lightuserdata就有细微的区别,具体参考 Lua userdata和lightuserdata的区别
至此,Lua 的TValue大体设计就差不多这样了,就是一个TValue用遍整个Lua.