2019独角兽企业重金招聘Python工程师标准>>>

缘起

luaL_setfuncs 这个函数可以注册c函数到lua,另外还可以设置闭包函数使用的变量upvalue. 我没有用过,在 云风的skynet 才第一次见过,于是写个例子实际使用以下.

函数原型:

void luaL_setfuncs (lua_State L, const luaL_Reg l, int nup);

文档定义:

Registers all functions in the array l (see luaL_Reg) into the table on the top of the stack (below optional upvalues, see next).

When nup is not zero, all functions are created sharing nup upvalues, which must be previously pushed on the stack on top of the library table. These values are popped from the stack after the registration.

意思是第三个参数 nup 如果非零, 则所有通过luaL_setfuncs注册的函数都共享 nup个 upvalues. 这些 upvalues 必须在注册之前 pushed 到栈上.

实例

#include <lua.h>
#include <lauxlib.h>static int add(lua_State *L){double op1 = luaL_checknumber(L,1);double op2 = luaL_checknumber(L,2);//将函数的结果压入栈中。如果有多个返回值,可以在这里多次压入栈中。lua_pushnumber(L,op1 + op2);//返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量。return 1;
}static int add_with_upvalue(lua_State *L){int k = lua_tonumber(L, lua_upvalueindex(1));const char* another_upvalue = lua_tostring(L, lua_upvalueindex(2));printf("second upvalue is %s\n",another_upvalue);double op1 = luaL_checknumber(L,1);double op2 = luaL_checknumber(L,2);//将函数的结果压入栈中。如果有多个返回值,可以在这里多次压入栈中。lua_pushnumber(L,op1 + op2+k);//返回值用于提示该C函数的返回值数量,即压入栈中的返回值数量。return 1;
}static const luaL_Reg no_upvalue_func[] = {{"add", add},{0, 0}
};static const luaL_Reg with_upvalue_func[] = {{"add_with_upvalue", add_with_upvalue},{0, 0}
};
LUALIB_API int luaopen_mytest(lua_State * L) {lua_newtable(L);/*register function no upvalue*/luaL_setfuncs(L, no_upvalue_func, 0);/*set two upvalue */lua_pushnumber(L,100);lua_pushstring(L,"i am upvalue");/*register function with two upvalue*//*push了两个upvalue值所以第三个参数是2*/luaL_setfuncs(L, with_upvalue_func, 2);return 1;
}

测试

local mytest = require "mytest"ret = mytest.add(10,20)
print(ret)ret = mytest.add_with_upvalue(10,20)
print(ret)
lua test.lua
output:
30.0
second upvalue is i am upvalue
130.0

转载于:https://my.oschina.net/robslove/blog/1817940

luaL_setfunc设置upvalue的用法示例相关推荐

  1. Go基础系列:双层channel用法示例

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 双层通道的解释见Go的双层通道 ...

  2. sql语句中的in用法示例_PHP中的循环语句和示例

    sql语句中的in用法示例 循环 (Loops) Imagine that we need a program that says "hello world" 100 times. ...

  3. php theexcerpt,wordpress的excerpt()函数的用法示例

    本篇文章给大家带来的内容是关于wordpress的excerpt()函数的用法示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 问题:在wordpres中的single页面,本身引 ...

  4. java this.val$_[Java教程]Jquery $(this).attr和$(this).val用法示例

    [Java教程]Jquery $(this).attr和$(this).val用法示例 0 2017-08-17 17:00:11 以下是个人心得整理,有兴趣朋友可以参考参考 $(this).attr ...

  5. to_sql用法示例_SQL Union概述,用法和示例

    to_sql用法示例 This article will provide a deep dive into the SQL Union operator, describing its many us ...

  6. chmod 用法示例

    介绍 Linux中的Chmod命令用于更改或分配文件和目录的权限.在Linux/Unix系统中,文件和目录的可访问性是由文件所有权和权限决定的.在上一篇文章中,我们了解了如何使用chown命令管理文件 ...

  7. java反射用法示例_Java反射示例教程

    java反射用法示例 Java Reflection provides ability to inspect and modify the runtime behavior of applicatio ...

  8. AWK用法示例 awk命令

    AWK:Linux 管理员的智能工具包 作者 Emmett Dulaney AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一.这种编程及 ...

  9. python中图例legend标签内容_matplotlib设置legend图例代码示例

    matplotlib设置legend图例代码示例 本文主要是关于matplotlib的一些基本用法. Demo import matplotlib.pyplot as plt import numpy ...

最新文章

  1. Occupancy Networks:基于学习函数空间的三维重建表示方法
  2. 前端CSS基础7.8
  3. JavaScript中数组的增删改查以及应用方式
  4. 训练1000层的Transformer究竟有什么困难?
  5. 自定义分页 html,MVC 自定义HtmlHelper帮助类型之分页
  6. eclipserunas里没有选项_轻松开启“开发人员选项”,优化手机设置
  7. 杭州自学python爬虫_金华自学python网络爬虫直播
  8. 【转载】煤层气大事记
  9. numpy 高阶函数 —— np.histogram
  10. 谷歌AI版“你画我猜”刷屏朋友圈,背后是这样的原理!
  11. gammaray报Error: gdb: Yama security extension is blocking runtime attaching, see /proc/sys/kernel/yam
  12. python拟合非线性模型_python-绘制分段拟合到非线性数据
  13. 电脑关机一段时间后不能网络唤醒WOL
  14. K型热电偶(k-type)温度与电压转换计算笔记
  15. Python爬虫——来自新人的叹息
  16. 魔兽世界美服部落人数最多服务器,美服部落转联盟服务正式开启 规模继续扩大...
  17. 2021年数字IC秋招总结
  18. Log4j 严重漏洞修最新修复方案参考
  19. Linux内核4.14版本——Nand子系统(1)——hisi504_nand.c分析
  20. 通用计算机冯诺依曼,冯。诺依曼计算机

热门文章

  1. 商务办公管理咨询服务响应式模板
  2. 百度SEO Keyword Surfer v0.3.7(关键词优化)
  3. 高并发处理方案_高并发系统下的缓存解决方案
  4. c语言while队列不为空,C语言实现循环队列的初始化进队出队读取队头元素判空-2...
  5. linux常用时间命令全集,Linux 指令篇:日期时间排程--date
  6. git常用操作,切换分支,合并分支
  7. 漂亮简洁的宇宙人404单页html源码
  8. 多主机远程桌面连接,系统自带的。tsmmc
  9. KODExplorer 简介
  10. JS判断浏览器是否支持某一个CSS3属性