Lua与C/C++之我最初对于luaL_loadfile的一个误解

原创 2005年04月23日 10:24:00
最开始学习lua嵌入c的时候,一般会写下这样的一个小程序来执行一个脚本文件:
代码:

int _tmain(int argc, _TCHAR* argv[])
{
    // 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脚本可能是这样
代码:
function foobar()
    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代码

代码:
print("foobar!")


假设把这个脚本文件命名为foobar函数,程序中则可以这么写

代码:
lua_pushstring( L, "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)

luaL_dofile和luaL_loadfile的区别

C++调用lua的时候要加载lua文件,用这两个都可以,那么它俩有什么区别呢? 看文档中的解释: luaL_dofile:       它是这样子定义的:       #define luaL...

luaL_dofile和luaL_loadfile的区别

C++调用lua的时候要加载lua文件,用这两个都可以,那么它俩有什么区别呢? 看文档中的解释: luaL_dofile:       它是这样子定义的:       (LuaL_loadfile(L...

lua中load的使用方法

前面一篇博文提到了,用load函数实现Lua的反射机制,但是没有深入的讲解load的用法。load的本质就是在Lua代码中运行一段存储在字符串中的代码。但很快你会发现,它并不是将字符串去掉“引号”那么...

lua loadstring与loadfile

http://www.cnblogs.com/stephen-liu74/archive/2012/06/22/2414417.html   1. 编译:     Lua中提供了dofil...
  • icyday
  • icyday
  • 2012年10月25日 20:17
  • 8456

Lua中require、dofile、loadfile的区别

lua文件是以chunk的方式存在的,其本质是一个函数

lua程序设计第二版 读书笔记(9-10章)

书本下载地址                       http://download.csdn.net/detail/myy2012/5349646 本部分下载地址             ...
  • myy2012
  • myy2012
  • 2013年05月10日 15:44
  • 1022

lua模块的几种实现方式

lua模块的几种实现方式 1.一种是大家比较常见的比较简单的实现方式:利用table实现,最后返回这个table变量。 -- -- Created by IntelliJ ID...

Lua dofile loadfile loadstring 区别

dofile,把它当作 Lua 运行代码的 chunk 的一种原始的操作。dofile 实际上是一个辅助的函数。真正完成功能的函数是 loadfile;与 dofile 不同的是 loadfile 编...

lua5.3源码基础阅读(luaL_openlibs)

C库结构和导入到lua 导入全局性的库到lua中,这些库由C实现: /* ** these libs are loaded by lua.c and are readily avail...

Lua 初识之 loadfile、require、module - 十五

Lua 初识之 loadfile、require、module– Lua 中不同脚本交互调用,一般使用 dofile、loadfile、require。一、 loadfileTest.lua 脚本Te...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua与C/C++之我最初对于luaL_loadfile的一个误解
举报原因:
原因补充:

(最多只允许输入30个字)