轉自:https://blog.csdn.net/GJQI12/article/details/81105975
//Lua筆記-關於lua table的C API
//Lua版本5.2
/*相關API:
lua_createtable
原型: void lua_createtable (lua_State *L, int narr, int nrec);
描述: 創建一個新的table並將之放在棧頂.narr是該table數組部分的長度,nrec是該table hash部分的長度.
當我們確切的知道要放多少元素到table的時候,使用這個函數,lua可以預分配一些內存,提升性能.
如果不確定要存放多少元素可以使用 lua_newtable 函數來創建table.
lua_newtable
原型: void lua_newtable (lua_State *L);
描述: 創建一個新的table並將之放在棧頂. 等同於lua_createtable(L, 0, 0).
lua_getfield
原型: void lua_getfield (lua_State *L, int index, const char *k);
描述: 將t[k]元素push到棧頂. 其中t是index處的table.
這個函數可能觸發index元方法.
lua_setfield
原型: void lua_setfield (lua_State *L, int index, const char *k);
描述: 為table中的key賦值. t[k] = v . 其中t是index處的table , v為棧頂元素.
這個函數可能觸發newindex元方法.
調用完成后彈出棧頂元素(value).
lua_gettable
原型: void lua_gettable (lua_State *L, int index);
描述: 將t[k]元素push到棧頂. 其中t是index處的table,k為棧頂元素.
這個函數可能觸發index元方法.
調用完成后彈出棧頂元素(key).
lua_settable
原型: void lua_settable (lua_State *L, int index);
描述: 為table中的key賦值. t[k] = v . 其中t是index處的table , v為棧頂元素. k為-2處的元素.
這個函數可能觸發newindex元方法.
調用完成后彈出棧頂兩個元素(key , value)
lua_rawget
原型: void lua_rawget (lua_State *L, int index);
描述: 與lua_gettable函數類似, 但是不會觸發index元方法.
lua_rawset
原型: void lua_rawset (lua_State *L, int index);
描述: 與lua_settable函數類似, 但是不會觸發newindex元方法.
lua_rawgeti
原型: void lua_rawgeti (lua_State *L, int index, int n);
描述: 將t[n]元素push到棧頂.其中t是index處的table.
這個函數不會觸發index元方法.
lua_rawseti
原型: void lua_rawseti (lua_State *L, int index, int n);
描述: 為table中的key賦值. t[n] = v .其中t是index處的table , v為棧頂元素.
這個函數不會觸發newindex元方法.
調用完成后彈出棧頂元素.
lua_rawgetp
原型: void lua_rawgetp (lua_State *L, int index, const void *p);
描述: 將t[p]元素push到棧頂.其中t是index處的table. p是一個lightuserdata.
這個函數不會觸發index元方法.
lua_rawsetp
原型: void lua_rawsetp (lua_State *L, int index, const void *p);
描述: 為table中的key賦值. t[p] = v .其中t是index處的table , p是一個lightuserdata , v為棧頂元素.
這個函數不會觸發newindex元方法.
調用完成后彈出棧頂元素.
lua_getmetatable
原型: int lua_getmetatable (lua_State *L, int index);
描述: 將index處元素的元表push到棧頂. 如果該元素沒有元表, 函數返回0 , 不改變棧.
lua_setmetatable
原型: void lua_setmetatable (lua_State *L, int index);
描述: 將棧頂元素設置為index處元素的元表.
調用完成后彈出棧頂元素.
lua_istable
原型: int lua_istable (lua_State *L, int index);
描述: 判斷index處元素是否為一個table , 如果是返回1,否則返回0.
lua_pushglobaltable
原型: void lua_pushglobaltable (lua_State *L);
描述: 將lua的全局表放在棧頂.
luaL_newmetatable
原型: int luaL_newmetatable (lua_State *L, const char *tname);
描述: 如果注冊表中已經有名為tname的key,則返回0.
否則創建一個新table作為userdata的元表. 這個元表存儲在注冊表中,並以tname為key. 返回1.
函數完成后將該元表置於棧頂.
luaL_getmetatable
原型: void luaL_getmetatable (lua_State *L, const char *tname);
描述: 將注冊表中以tname為key的元表push到棧頂.
luaL_setmetatable
原型: void luaL_setmetatable (lua_State *L, const char *tname);
描述: 將棧頂元素存儲到注冊表中, 它的key為tname.
luaL_getsubtable
原型: int luaL_getsubtable (lua_State *L, int idx, const char *fname);
描述: 將 t[fname] push到棧頂, 其中t是index處的table , 並且 t[fname] 也為一個table.
如果 t[fname] 原本就存在,返回 true ,否則返回false,並且將 t[fname] 新建為一張空表.
lua_getglobal
原型: void lua_getglobal (lua_State *L, const char *name);
描述: 將 t[name] 元素push到棧頂, 其中t為全局表.
lua_setglobal
原型: void lua_setglobal (lua_State *L, const char *name);
描述: 為table中的key賦值. t[name] = v . 其中t為全局表. v為棧頂元素.
調用完成后彈出棧頂元素(v).
luaL_newlibtable
原型: void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
描述: 創建一張空表, lua預先分配足夠的內存用來存儲我們創建的函數庫.
稍后我們可以使用 luaL_setfuncs 函數注冊我們的函數庫.
luaL_setfuncs
原型: void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
描述: 將所有 luaL_Reg數組中的函數注冊到棧頂的table中.
當upvalue個數不為0時,所創建的所有函數共享這些upvalue. -2到-(nup+1)的元素為要注冊的upvalue.
(注意:這些upvalue是c中的upvalue,不是lua中的upvalue,可以在注冊的c函數中通過 lua_upvalueindex(n)獲取其值.)
調用完成后彈出棧頂的所有upvalue.
luaL_newlib
原型: void luaL_newlib (lua_State *L, const luaL_Reg *l);
描述: 創建一個新的table , 並將luaL_Reg數組中的函數注冊到其中.
它是一個宏 (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
lua_next
原型: int lua_next (lua_State *L, int index);
描述: 該函數用來遍歷一個table.
從棧頂彈出一個key , 並且push一個 key-value對(棧頂key的下一個鍵值對) ,到棧頂.
如果table中沒有更多的元素, 函數返回0.
遍歷開始時棧頂為一個nil , 函數取出第一個鍵值對.
通常遍歷方法為:
lua_pushnil(L); // first key
while (lua_next(L, t) != 0) {
// uses 'key' (at index -2) and 'value' (at index -1)
printf("%s - %s\n",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
// removes 'value'; keeps 'key' for next iteration
lua_pop(L, 1);
}
注意: 在遍歷table的時候 ,除非明確的知道key為字符串,不要對棧上的key使用 lua_tolstring 函數 ,
因為這樣有可能改變key的類型 , 影響下一次 lua_next調用.
lua_rawlen
原型: size_t lua_rawlen (lua_State *L, int index);
描述: 獲取index處元素的長度.
對於字符串來說,返回字符串長度.
對於table來說,返回#操作符的長度. 不受元方法影響.
對於userdata來說,返回內存的大小.
其他元素返回0.
lua_len
原型: void lua_len (lua_State *L, int index);
描述: 獲取index處元素#操作符的結果 , 放置在棧頂.
*/
/* 其他概念:
1.偽索引:
Lua棧的正常索引 從棧頂算,棧頂為-1,向棧低遞減. 從棧低算,棧低為1,向棧頂遞增.
偽索引是一種索引,他不在棧的位置中,通過一個宏來定義偽索引的位置.
偽索引被用來訪問注冊表,或者在lua_CFunction中訪問upvalue.
2.注冊表:
Lua的注冊表是一個預定義的table, 可以提供給c api存儲一切想要存儲的值.
注冊表通過 LUA_REGISTRYINDEX 偽索引來訪問.
例如 lua_getfield 函數可以像下面這樣使用來獲取注冊表中的一個以"hello"為key的值 :
lua_getfield( L , LUA_REGISTRYINDEX , "hello");
3. upvalue:
在使用 lua_pushcfunction 或者 luaL_setfuncs 將一個lua_CFunction 注冊到Lua環境中時,
可以同時為這個函數設置一些upvalue .
而后在這些lua_CFunction 中可以使用 lua_upvalueindex(n) 函數來獲取對應位置的upvalue.
*/