Lua与C/C++之我最初对于luaL_loadfile的一个误解
来源:互联网 发布:java string 编辑:程序博客网 时间:2024/06/02 08:16
{
// Open lua state
lua_State* L = lua_open();
luaopen_base( L );
// Load script file
luaL_loadfile( L, "Script.lua" );
lua_resume( L, 0 );
// Call foobar
lua_getglobal( L, "foobar" );
lua_pushnumber( L, 211 );
if( lua_resume( L, 1 ) )
printf( "%s/n", lua_tostring( L, 1 ) );
// Close it
lua_close( L );
return 0;
}
对应的lua脚本可能是这样
print( "foobar!" )
end
这个程序很简单,运行的结果就是输出一个字符串 foobar!
在程序loadfile之后会马上有一句:
lua_resume(L,0);
在我开始学习它的时候,我想当然的认为要执行一个脚本文件中的函数,必须resume才会使脚本有效,否则任何语句都是不会让它执行的(描述好象有点问题),在后来的认识中,其实不是这样。
当luaL_loadfile(实际上最终是调用lua_load函数)之后lua_resume并不是必需的,为什么?
lua_load读入一段脚本之后把读入的东西当成一个匿名函数放在栈顶上,所以调用lua_resume(L,0);
就会执行这个函数
再看看lua_resume做了些什么就很清楚了:首先在默认情况下,执行一段lua脚本的当前执行环境(function environment)是全局表,即脚本中的_G,执行这个函数(脚本文件的代码)时,由于只有一个function的定义,于是就会将这个函数加入到执行的这个函数(脚本文件的代码)的执行环境表(也就是全局表)中
接下来的事情就很明显了,lua_getglobal(L,"foobar")找到这个函数,然后执行。而如果你在loadfile之后并没有调用lua_resume(L,0),那么你就不能在后面的lua_getglobal中找到foobar(返回值是一个LUA_TNIL),从而执行失败。
假如有种设计为一个脚本文件对应一个函数,那么我肯定在想输出一个简单的字符串如"foobar!"时不想还去输入function foobar()这段字(或者说我想让脚本编写者可以直接就写一段脚本就可以被执行)
那么可能有如下的lua代码
假设把这个脚本文件命名为foobar函数,程序中则可以这么写
luaL_loadfile( L, "Script.lua" );
lua_rawset( L, LUA_GLOBALSINDEX ); // 一般情况下,lua_settable也可
// Call foobar
lua_getglobal( L, "foobar" );
if( lua_resume( L, 0 ) )
printf( "%s/n", lua_tostring( L, 1 ) );
这里没有lua_resume,而是用一个lua_rawset代替了
作者:风舞影天 转自:Lua中文网站(www.luachina.net)
- Lua与C/C++之我最初对于luaL_loadfile的一个误解
- Lua与C/C++之我最初对于luaL_loadfile的一个误解
- 一个lua 与c交互的小demo
- lua 与c的交互
- Lua与C的交互
- Lua与C的交互
- lua与c的交互
- C与Lua的交互
- Lua的与C交互
- 和我一起写lua - C和lua的参数传递与返回值
- 和我一起写lua - C和lua的参数传递与返回值
- Lua 基础之与 C 交互
- 【Lua】Lua与C交互
- Lua的使用入门之C/C++与lua函数的混合调用
- Lua程序设计笔记之七: lua与c互调
- lua编程之lua与C相互调用
- C调用LUA创建一个简单的LUA解释器
- lua与c互调--c调用lua
- datagrid添加事件
- 硬盘分区结构及windows文件系统结构
- 关于英文商标或者标识的命名方式
- ask for help :)
- 单片机中unsigned char转字符串的方法
- Lua与C/C++之我最初对于luaL_loadfile的一个误解
- 无题
- SqlServer中删除用户
- 转:用 Kerberos 为 J2ME 应用程序上锁,第 3 部分: 建立与电子银行的安全通信
- 两家公司:GSL & Xfab
- LUA中的栈
- 使用XmlSerializer 进行xml序列化
- 关于日本人
- 如何使用Lua扩展C/C++应用系列1