Lua常用方法分析

来源:互联网 发布:淘宝热销产品排行榜 编辑:程序博客网 时间:2024/06/14 05:44

本文在拜读酸毛杏儿的《lua常用方法》一文后,写下此文。

Lua常用方法,本文一共讲解8个方法,依次如下:

1.lua_gettable

lua_getglobal(L, "mytable") <== push mytablelua_pushnumber(L, 1)        <== push key 1lua_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 mytablelua_pushnumber(L, 1)        <== push key 1lua_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_gettable

2、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 mytablelua_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 处的一个值。 这是一个直接访问;就是说,它不会触发元方法。

key值要求必须是数值。

6.lua_rawseti

lua_getglobal(L, "mytable") <== push mytablelua_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 mytablelua_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 mytablelua_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值必须为字符串
0 0