本文在拜读酸毛杏儿的《lua常用方法》一文后,写下此文。
Lua常用方法,本文一共讲解8个方法,依次如下:
1.lua_gettable
lua_getglobal(L, "mytable") <== push mytable
lua_pushnumber(L, 1) <== push key 1
lua_gettable(L, -2) <== pop key 1, push mytable[1]
void lua_gettable (lua_State *L, int index);
把t[k]
值压入堆栈,这里的t
是指有效索引index
指向的值,而k
则是栈顶放的值。
这个函数会弹出堆栈上的 key(把结果放在栈上相同位置)。在 Lua 中,这个函数可能触发对应 "index" 事件的元方法
上面这段文字是风云5.1在线手册上对lua_gettable的解释。下面我们讲解一下酸毛杏儿的代码。1、lua_getglobal:把一个全局变量name的值压入栈,代码中是把mytable压入栈,索引是1
2、lua_pushnumber:把一个数字n压入栈,代码中把key = 1压入栈
3、lua_gettable(L,-2):由上面对lua_gettable的解释可以知道,index是-2,由于上一步压入了k,所以index为-2的栈元素是mytable表,即t = mytable。t[k] = value,value是栈顶元素,此时由于没有压入value值,栈顶值是1,所以mytable[1] = 1。同时,弹出堆栈上的key,并把结果放在key的位置。
2.lua_settable
lua_getglobal(L, "mytable") <== push mytable
lua_pushnumber(L, 1) <== push key 1
lua_pushstring(L, "abc") <== push value "abc"
lua_settable(L, -3) <== mytable[1] = "abc", pop key & value
void lua_settable (lua_State *L, int index);
作一个等价于t[k] = v
的操作,这里 t
是一个给定有效索引 index
处的值, v
指栈顶的值, 而 k
是栈顶之下的那个值。
这个函数会把键和值都从堆栈中弹出。 和在 Lua 中一样,这个函数可能触发 "newindex" 事件的元方法
1、同lua_gettable2、lua_pushnumber:同lua_gettable
3、lua_pushstring:把指针s指向以0结尾的字符串压栈。lua对这个字符串做一次内存拷贝(或是复用一个拷贝),因此s出的内存在函数返回后,可以释放掉或是重用于其他用途,字符串中不能包含含有0的字符,第一个碰到的0字符会认为是字符串的结束。
4、lua_settable:index是-3,即t = mytable,k为压栈的1,v为压栈的"abc",执行该方法,把k和v从堆栈中弹出,把t[k]设置为v
3.lua_rawget
用法同lua_gettable,但更快,因为当key不存在时不用访问元方法__index
4.lua_rawset
用法同lua_settable,但更快,因为当key不存在时不用访问元方法__newindex
5.lua_rawgeti
lua_getglobal(L, "mytable") <== push mytable
lua_rawgeti(L, -1, 1) <== push mytable[1],作用同下面两行调用
--lua_pushnumber(L, 1) <== push key 1
--lua_rawget(L,-2) <== pop key 1, push mytable[1]
void lua_rawgeti (lua_State *L, int index, int n);
把 t[n]
的值压栈, 这里的 t
是指给定索引 index
处的一个值。 这是一个直接访问;就是说,它不会触发元方法。
6.lua_rawseti
lua_getglobal(L, "mytable") <== push mytable
lua_pushstring(L, "abc") <== push value "abc"
lua_rawseti(L, -2, 1) <== mytable[1] = "abc", pop value "abc"
void lua_rawseti (lua_State *L, int index, int n);
等价于 t[n] = v
, 这里的 t
是指给定索引 index
处的一个值, 而 v
是栈顶的值。
函数将把这个值弹出栈。 赋值操作是直接的;就是说,不会触发元方法。
同样,key要求必须是数值7.lua_getfield
lua_getglobal(L, "mytable") <== push mytable
lua_getfield(L, -1, "x") <== push mytable["x"],作用同下面两行调用
--lua_pushstring(L, "x") <== push key "x"
--lua_gettable(L,-2) <== pop key "x", push mytable["x"]
void lua_getfield (lua_State *L, int index, const char *k);
把 t[k]
值压入堆栈, 这里的 t
是指有效索引 index
指向的值。 在 Lua 中,这个函数可能触发对应 "index" 事件的元方法
key值必须为字符串
8.lua_setfield
lua_getglobal(L, "mytable") <== push mytable
lua_pushstring(L, "abc") <== push value "abc"
lua_setfield(L, -2, "x") <== mytable["x"] = "abc", pop value "abc"
void lua_setfield (lua_State *L, int index, const char *k);
做一个等价于 t[k] = v
的操作, 这里 t
是给出的有效索引 index
处的值, 而 v
是栈顶的那个值。
这个函数将把这个值弹出堆栈。 跟在 Lua 中一样,这个函数可能触发一个 "newindex" 事件的元方法
key值必须为字符串