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.