c保存lua函数
使用下面方式可保存lua任何值,目前只实现fucntion的保存,且无参数。如果需要实现参数,可自己扩展:
可实现下面方式:
CFun( lua_fun ) -- ok
CFun( function() print("Hello world") end ) --ok
local xxx = function print("Hello world" ) end
CFun( xxx ) --ok
lua_value.h
#ifndef __LUA_VALUE_H__
#define __LUA_VALUE_H__extern "C" {
#include "lualib.h"
#include "lauxlib.h"
}class LuaFunction
{
public:
LuaFunction(lua_State* L):m_L(L), m_ref(0){};
LuaFunction(lua_State* L, int index);
~LuaFunction();void registerValue();
void push()const
{
lua_rawgeti(m_L,LUA_REGISTRYINDEX,m_ref);
}public:
int Call();
bool Validate();
protected:
lua_State* m_L;
int m_ref;
};
#endif
lua_value.cpp
#include "lua_value.h"
LuaFunction::LuaFunction( lua_State* L, int index ): m_L(L)
{
m_ref = lua_ref( m_L, index );
}LuaFunction::~LuaFunction()
{
if (m_L && m_ref != 0)
{
luaL_unref(m_L,LUA_REGISTRYINDEX,m_ref);
}
}bool LuaFunction::Validate()
{
if (!m_L)
{
return false;
}
push();
bool v = lua_isfunction(m_L,-1);
lua_pop(m_L,1);
return v;
}int LuaFunction::Call()
{
if (!Validate())
{
return -1;
}
int status = -1;
push();
if( lua_isfunction( m_L, -1 ) )
{
status = lua_pcall(m_L, 0, 1,NULL);
}
lua_pop(m_L, 1);
return status;
}void LuaFunction::registerValue()
{
m_ref = lua_ref( m_L, 2 ); //2为参数索引号,如果调用函数中包括其他参数,需要根据实际需要修改
}
lua测试代码:
valueTest=nil
for i=1,5,1 do
function showidx()print(i)
return i;
end
if i== 3 then
valueTest = LuaFunction:new()
valueTest:registerValue(showidx)
end
endvalueTest:Call()
lua封装代码可用tolua实现,需要注意regisgerValue需要修改一下:
static int tolua_lua_value_LuaFunction_registerValue00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertype(tolua_S,1,"LuaFunction",0,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
LuaFunction* self = (LuaFunction*) tolua_tousertype(tolua_S,1,0);
#ifndef TOLUA_RELEASE
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'registerValue'",NULL);
#endif
{
self->registerValue();
}
}
return 0;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'registerValue'.",&tolua_err);
return 0;
#endif
}
c保存lua函数的更多相关文章
- Lua函数之二
Lua函数之二 Lua中函数的两个重要特性: 1.函数和其他类型(如number.string)一样,可以存放在变量中,也可以存放在table中,可以作为函数的参数,还可以作为函数的返回值. 2.嵌套 ...
- C模块回调Lua函数的两种方法
作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...
- lua函数随记
在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...
- Lua函数[转]
在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...
- lua函数定义
FuncState proto结构数组保存函数原型信息;prev保存父函数体指针:actvar保存定义的局部变量:upvalues保存upvalue Lua源码中,专门有一个结构体FuncState用 ...
- C 调用 lua 函数
C 调用 lua 函数 需要考虑的问题: 1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值 ...
- lua_自己对“lua函数”知识点的总结
lua_自己对“lua函数”知识点的总结 1.lua函数的定义 --lua中,函数都是function类型的对象.(1)其可以被比较 (2)其可以赋值给一个对象(3)可以传递给函数(4)可以从函数中返 ...
- C中调用Lua函数
我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...
- Lua函数之一
LUA函数之一 函数声明: function foo(arguments) statements end 1.函数调用 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用,例如: os.da ...
随机推荐
- The Frog's Games(二分)
The Frog's Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) ...
- Ant命令行操作
Ant命令行操作 Ant构建文件可以将项目编译,打包,測试,它是Apache软件基金会jakarta文件夹中的一个子项目,具有跨平台性,操作简单,并且非常easy上手. 关于Ant执行,能够在项目中找 ...
- fastclick.js介绍
原文地址:http://www.uedsc.com/fastclick.html 用途:去掉移动端click事件的300ms的延迟. 延迟为什么存在 …在移动浏览器中,当你点击按钮的单击事件时,将 ...
- table-cell完成左侧定宽,右侧定宽及左右定宽等布局
使用table-cell完成以下几种布局(ie8及以上兼容) 1.左侧定宽-右侧自适应 .left{ width: 300px; height: 500px; border: 1px solid; f ...
- 创建对象时引用的关键字,assign,copy,retain
创建对象时引用的关键字:assign: 简单赋值,不更改索引计数(强引用)copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索 ...
- BlockingQueue
BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html BlockingQueue深入分析 http://blog.cs ...
- VS2012 运行项目在IE中可以运行,但是在google和firefox却不能打开。
笔记本重装了系统之后,打开VS2012 调试的时候,发现在IE下能够运行调试.net项目,但是使用google和firefox的时候却不能打开项目.苦思冥想不知道是怎么回事儿,后来经过在网上查阅各种资 ...
- java学会需要掌握的知识(来源网上。。)
Java就业指导 2016-03-22 骆昊 程序人生 点击上方"程序人生"关注我们 想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些 ...
- html5页面增强元素
figure元素以及figcaption元素 <figure> <img src="images/1.jpg" alt="图片"> &l ...
- python-整理-vs2013新建文件编码
使用VS2013新建py包和py空文件还有文本文件时发现编码是936.如果代码中写了中文关闭后再打开就乱码了. 找了几个小时,发现模板文件就是936编码,奇怪的是pyclass等其它模板是正常的UTF ...