• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua_call的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  在学习一门语言的时候,开始的时候就是不断熟悉其提供的API函数,只有熟悉了API函数的使用,才能在里面加入自己的思想,从而发挥作用达到自己的目的。今天学习的是lua_call,和该函数相似的函数分别是lua_pcall和lua_cpcall.这些函数的目的就是让我们能够执行压入栈中的函数,该函数可能是lua中定义的函数,可能是C++重定义的函数,当然我们一般是用来执行lua中执行的函数,C++中定义的基本上可以直接调用的。函数原型:

void lua_call (lua_State *L, int nargs, int nresults);
L是执行环境,可以理解为当前栈,nargs参数个数,nresults返回值个数。lua_pcall和该函数区别是多一个参数,用于发生错误处理时的代码返回。
void lua_pcall(lua_State *L,int nargs, int nresults,int nerrfunc);lua_cpcall则又多一个用于传递用户自定义的数据结构的指针
void lua_cpcall(lua_State *L,int nargs, int nresults,int nerrfunc,void* ud)
对于函数的使用场景,在网上有一个网友的说明是这样的:

lua_call的运行是无保护的,他与lua_pcall相似,但是在错误发生的时候她抛出错误而不是返回错误代码。当你在应用程序中写主流程的代码时,不应该使用lua_call,因为你应该捕捉任何可能发生的错误。当你写一个函数的代码时,使用lua_call是比较好的想法,如果有错误发生,把错误留给关心她的人去处理.

结论: 写应用程序主流程代码用lua_pcall 写C Native Function代码时用lua_call,与之类似的还有luaL_checkxxx

下面是一个在文档中列举的一个例子:

The following example shows how the host program can do the equivalent to this Lua code:

     a = f("how", t.x, 14)

Here it is in C:

  1. lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */  
  2. lua_pushstring(L, "how");                        /* 1st argument */  
  3. lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */  
  4. lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */  
  5. lua_remove(L, -2);                  /* remove 't' from the stack */  
  6. lua_pushinteger(L, 14);                          /* 3rd argument */  
  7. lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */  
  8. lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */  
     lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */
     lua_pushstring(L, "how");                        /* 1st argument */
     lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */
     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
     lua_remove(L, -2);                  /* remove 't' from the stack */
     lua_pushinteger(L, 14);                          /* 3rd argument */
     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
     lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */

在上面的例子除了描述了lua_call的使用外,还对lua_getfield的使用有一定的参考价值。特别是学习如何在一个表中获取他的值。
在上面的例子中,可能再调用lua_getfield时就会忘记调用lua_remove,当然这是我想象自己使用时会犯下的错。lua_getfield函数功能是从指定表中取出指定元素的值并压栈。上面获取t.x的值的过程就是先调用
 lua_getfield(L, LUA_GLOBALSINDEX, "t"); 从全局表中获取t的值,然而t本身是一个表,现在栈顶的值是t表。于是再一次
 lua_getfield(L, -1, "x"); 从t中取出x的值放到栈上,-1表示栈顶。那该函数执行完成后t的位置由-1就变成-2了,所以下面一句
lua_remove索引的是-2,必须把t给remove掉,否则栈中就是4个参数了。上面的最后一句lua_setfield的目的是把返回值取回赋给全局变量a,因为在lua_call执行完成后,栈顶的就是返回值了。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua打包exe发布时间:2022-07-22
下一篇:
转多线程中的lua同步问题发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap