LUA 一些常用函数的简单注解说明

来源:互联网 发布:淘宝宝贝物流重量 编辑:程序博客网 时间:2024/05/20 21:49
 LUA解释器的整个State如全局变量、堆栈等都存储在一个结构类型为Lua_State动态分配的对象里.指向这一对象的指针必须作为第一个参数传递给所有连接库的API.在调用所有的API函数之前,你必须先用lua_open以生成一个State.
lua_State* lua_open(void)void lua_close(lua_State *L)//通过调用lua_close来释放一个通过lua_open生成的state

LUA使用虚拟堆栈机制和C程序互相传值,所有的堆栈中的元素都可以看作一个LUA值如Nil,Number,String等

int lua_gettop(lua_State *L)//取得栈顶元素的索引.因为索引从1开始计数,所以lua_gettop的返回值也就是这个堆栈的元素个数int lua_checkstack(lua_State *L,ine extra)//把堆栈的尺寸扩大到可以容纳Top+Extra个元素

任何时候Lua调用C,都可以保证最少有LUA_MINSTACK个堆栈位置是可用

void lua_settop(lua_State* L,int index)//把堆栈的栈顶索引设置为指定的数值#define lua_pop(L,n) lua_settop(L,-(n)-1)//用于把从栈顶开始的n个元素删除void lua_pushvalue(lua_State* L,int index)//将栈上指定索引处的值拷贝到栈顶void lua_remove(lua_State* L,int index)//删除给定索引的元素并移动相应的元素void lua_insert(lua_State* L,int index)//在给定索引处插入相应的元素同时溢出栈顶元素void lua_replace(lua_State* L,int index)//用栈顶元素去替换栈上指定索引处的元素
 int lua_type***********(lua_State *L,int index)//检测堆栈元素的数据类型 int lua_isnil**********(lua_State *L,int index) int lua_isboolean******(lua_State *L,int index) int lua_isnumber*******(lua_State *L,int index) int lua_isstring*******(lua_State *L,int index) int lua_istable********(lua_State *L,int index) int lua_isfunction*****(lua_State *L,int index) int lua_iscfunction****(lua_State *L,int index) int lua_isuserdata*****(lua_State *L,int index) int lua_islightuserdata(lua_State *L,int index)
int lua_equal   (lua_State *L,int index1,int index2)//比较堆栈中的两个值的大小的函数int lua_rawequal(lua_State *L,int index1,int index2)int lua_lessthan(lua_State *L,int index1,int index2)
int           lua_toboolean  (lua_State *L,int index)//把堆栈中的值转换为指定的C类型的相关函数lua_Number    lua_tonumber   (lua_State *L,int index)const char*   lua_tostring   (lua_State *L,int index)size_t        lua_strlen     (lua_State *L,int index)lua_CFunction lua_tocfunction(lua_State *L,int index)void         *lua_touserdata (lua_State *L,int index)lua_State    *lua_tothread   (lua_State *L,int index)void         *lua_topointer  (lua_State *L,int index)
void lua_pushboolean      (lua_State *L,int b)//能将C值压入堆栈void lua_pushnumber       (lua_State *L,lua_Number n)void lua_pushlstring      (lua_State *L,const char *s,size_t len)void lua_pushstring       (lua_State *L,const char *s)void lua_pushnil          (lua_State *L)void lua_pushcfunction    (lua_State *L,lua_CFunction f)void lua_pushlightuserdata(lua_State *L,void *p)
const char *lua_pushfstring (lua_State *L,const char *fmt,...)//格式化字符串const char *lua_pushvfstring(lua_State *L,const char *fmt,va_list argp)//格式化字符串void lua_getfield(lua_State *L,int index,const char *k) //获取栈上index索引指定的表上键为k的元素将之压到栈顶void lua_setfield(lua_State *L,int index,const char *k)//将栈上Index索引指定的表上键为k的元素值置为栈顶元素值void lua_gettable(lua_State *L,int index)//获取栈上index索引指定的表上键为栈顶元素值的元素将之压到栈顶void lua_settable(lua_State *L,int index)//将栈上index索引指定的表上键为栈顶开始第二个元素值的元素值置为栈顶元素值void lua_rawgeti(lua_State *L,int index,int n)//获取栈上index索引指定的表上下标为n的元素并将之压到栈顶
local TableA={1,2,3,4,5};size_t nNum=lua_objlen(L,index);//index变量为TableA元素在栈上的索引for(unsigned int ix=1;ix<=nNum;++ix){ lua_rawgeti(L,index,ix); int value=lua_tointeger(L,-1); lua_pop(L,1); }

 local TableB={x="X",y="Y"} lua_getfiled(L,index,"X")//index变量为TableB元素在栈上的索引 const char* X=lua_tostring(L,-1) lua_pop(L,1); lua_getfiled(L,index,"y"); const char* Y=lua_tostring(L,-1); lua_pop(L,1);
lua registry是一个全局的Table,它只能被C代码访问,通常可以用它来保存需要在几个模块中共享的数据.lua registry总是位于一个伪索引值LUA_REGISTRYINDEX之上.

int ref=luaL_ref(L,LUA_REGISTRYINDEX)//将栈顶元素存入lua registry中并返回在lua registry中的索引lua_rawgeti(L,LUA_REGISTRYINDEX,ref)//获取lua registry 上索引为ref的元素压入栈顶luaL_unref(L,LUA_REGISTYRINDEX,ref)//当不需要继续在lua registry中保留元素时,传入索引ref将之从lua registry上移出,以避免资源泄漏

lua stack上可以容纳的元素是有限的,而且会占用资源,通常以成对的 lua_gettop 和 lua_settop调用来维护栈大小,保证其间的操作在栈上分配的局部对象不会在栈上保留,特别是在调用lua call执行了lua函数并有返回但忽略返回值时.

int top=lua_gettop(L);lua_settop(L,top); 

XL_LRT_API long __stdcall XLLRT_LuaCall(lua_State* luaState,int args,int results,const wchar_t* contextInfo)//调用lua函数
调用lua函数,args指定传入参数数量,栈顶为最后一个参数,向栈底方向栈上的元素顺次为倒数第二参数直到第一个参数,第一个参数之前为要调用的函数对象.调用完成之后,将函数对象极其之后的所有元素从栈上弹出,如果results指定为LUA_MULTRET将函数对象的所有返回值压入栈上,否则压入results个返回值;contextInfo字符串指定上下文信息,在调用的lua函数出现脚本错误时的回调中用做标识.在Bolt里用要求用XLLuaRuntime模块的XLLRT_LuaCall调用代替lua_*call类函数.如lua  函数func,原型为 string,integer  func(integer,string) ,在C中调用之:(index变量为func函数对象在栈上的索引,L为所在lua_State指针)
int top=lua_gettop(L);                                                 lua_pushvalue(L,index);//index变量为func函数对象在栈上的索引                                            lua_pushinteger(L,1);lua_pushstring(L,"test");long Result=XLLRT_LuaCall(L,2,2,L"For Test");      if(Result==0){ const char* Ret1=lua_tostring(L,-2);               int Ret2=lua_tointeger(L,-1); }lua_settop(L,top);

等效于在lua中调用func Ret1,Ret2=func(1,"Test").需要注意的是XLLRT_LuaCall的返回值,当为0时说明调用的lua函数被正确执行,否则说明lua函数执行中断,一般是出现了脚本错误,此时lua栈上是不会有func函数执行之后的返回值的,不能取返回值进行操作,或者继续执行依赖于func成功执行的任何操作.

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

void lua_newtable(lua_State *L); 《=》lua_createtable(L,0,0) 创建一个空Table ,并将之压入堆栈void lua_settable(lua_State *L,int index);
作一个等价于 t[k]=v 的操作,这里t是一个给定有效索引 index 处的值,v 指栈顶的值,而 k 是栈顶之下的那个值.这个函数会把键和值都从堆栈中弹出.
void lua_rawseti(lua_State *L,int index,int n)
等价于 t[n]=v,这里的 t 是指给定索引 index 处的一个值,而v是栈顶的值.函数将把这个值弹出栈.不会触发元方法.
原创粉丝点击