好记性不如铅笔头

C && C++, Lua, 编程

Lua快速学习笔记:利用栈进行变量传递API

备注:

1 本笔记只记录了LUA的一小部分内容,对于LUA的描述并不全面,以后随用随增加吧。
2 本笔记参考《Lua程序设计 第二版》,截图和代码属于原作者所有。
3 作者初学LUA,经验和能力有限,笔记可能有错误,还请各位路过的大牛们给予指点。
4 API参考网址:参考网址: http://www.codingnow.com/2000/download/lua_manual.html

Lua和C通过栈进行交互。这里笔记下Lua和C通过栈进行数据传递使用的API。

lua_getglobal:

void lua_getglobal (lua_State *L, const char *name);
全局变量 name 里的值压入堆栈。 这个是用一个宏定义出来的:
     #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)

lua_setglobal:

void lua_setglobal (lua_State *L, const char *name);
从堆栈上弹出一个值,并将其设到全局变量 name 中。 它由一个宏定义出来:
     #define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)

lua_gettable:

void lua_gettable (lua_State *L, int index);
把 t[k] 值压入堆栈, 这里的 t 是指有效索引 index 指向的值, 而 k 则是栈顶放的值
这个函数会弹出堆栈上的 key (把结果放在栈上相同位置)。 

lua_getfield:

void lua_getfield (lua_State *L, int index, const char *k);
把 t[k] 值压入堆栈, 这里的 t 是指有效索引 index 指向的值。 

lua_settable:

void lua_settable (lua_State *L, int index);
作一个等价于 t[k] = v 的操作, 这里 t 是一个给定有效索引 index 处的值v 指栈顶的值, 而 k 是栈顶之下的那个值
这个函数会把键和值都从堆栈中弹出。 

lua_setfield:

void lua_setfield (lua_State *L, int index, const char *k);
做一个等价于 t[k] = v 的操作, 这里 t 是给出的有效索引 index 处的值, 而 v 是栈顶的那个值
这个函数将把这个值弹出堆栈。 

lua_createtable:

void lua_createtable (lua_State *L, int narr, int nrec);
创建一个新的空 table 压入堆栈。 这个新 table 将被预分配 narr 个元素的数组空间 以及 nrec 个元素的非数组空间。 当你明确知道表中需要多少个元素时,预分配就非常有用。 如果你不知道,可以使用函数 lua_newtable。

lua_newtable:

void lua_newtable (lua_State *L);
创建一个空 table ,并将之压入堆栈。 它等价于 lua_createtable(L, 0, 0) 。

数组形式的访问:

lua_rawget:

void lua_rawget (lua_State *L, int index);
类似于 lua_gettable, 但是作一次直接访问(不触发元方法)。

lua_rawgeti:

void lua_rawgeti (lua_State *L, int index, int n);
t[n] 的值压栈, 这里的 t 是指给定索引 index 处的一个值。 这是一个直接访问;就是说,它不会触发元方法。

lua_rawset:

void lua_rawset (lua_State *L, int index);
类似于 lua_settable, 但是是作一个直接赋值(不触发元方法)。

lua_rawseti:

void lua_rawseti (lua_State *L, int index, int n);
等价于 t[n] = v, 这里的 t 是指给定索引 index 处的一个值, 而 v 是栈顶的值。函数将把这个值弹出栈。 赋值操作是直接的;就是说,不会触发元方法。

发表评论

16 + 14 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据