Lua中编译执行代码相关的函数详解

 更新时间:2015年04月10日 10:30:10   投稿:hebedich  
这篇文章主要介绍了Lua中编译执行代码相关的函数详解的相关资料,需要的朋友可以参考下

可以说Lua之所以称为是一种解释型的语言,正是因为有诸如load这样的函数,因为这样的函数使得Lua可以执行动态生成的代码。下面具体来分析这些函数。

load函数

   load函数原型如下:

复制代码 代码如下:

load (chunk [, chunkname [, mode [, env]]]) 

 该函数加载一个chunk,如果没有错误,则返回一个函数。如果传入chunk的值是一个字符串,则就加载这个字符串;如果传入chunk的值是一个函数,则这个函数必须返回一个字符串,并且load会一直调用这个函数,直到这个函数返回空字符串或nil,load会把每次函数的返回结果连接起来作为chunk去加载。

如果没有语法错误,则load返回chunk对于的函数,否则返回nil和对应的错误信息。如果返回的函数有upvalue,则第一个upvalue的值被设置成传入的参数env,若没有传入这个参数的值,则第一个upvalue的值为全局环境。返回的函数upvalue不会任何其他函数共享。

    参数chunkname作为错误信息的chunk的名字,用于调试。若chunk是字符串,则chunkname默认值是变量chunk的值,否则是=(load)。参数mode决定了传入给chunk的值是文本或二进制数据。如果是”b”,则传给chunk的值必须是二进制数据(比如可以使用string.dump(foo)得到相应函数的二进制数据,然后传递给load),如果是”t”,而必须是文本数据,如果是”bt”,则文件或二进制数据都可以。默认值是”bt”。

    Lua不会检测二进制数据的稳定性,因此恶意的二进制数据可能导致Lua解释器Crash。

loadfile函数

    函数原型如下:

复制代码 代码如下:

loadfile ([filename [, mode [, env]]]) 

 该函数类似于load,但是从文件filename或标准输入(若filename为空)中活动chunk加载。
dofile函数
    函数原型如下:

复制代码 代码如下:

dofile ([filename]) 

 读取文件filename的内容,并把它作为lua的chunk执行。如果没传入参数,则从标准输入中读取执行内容。返回值跟chunk执行后返回的值相同。如果出现错误,dofile会把错误信息传递给它的调用者。也就是说,dofile在无保护模式下执行。注意该函数不同于loadfile,loadfile只是返回一个函数,并不会执行,并且出现错误时,loadfile会返回一个错误信息,而不会传递给它的调用者。总之、loadfile会从一个文件中加载Lua代码块,但不会运行代码,只是编译代码,然后将编译结果从一个函数返回。而dofile除了编译代码外,还会运行返回的结果。
    上面讨论的Lua层面的编译执行相关的函数,对应的C API相关函数有:lua_load、luaL_loadfilex、luaL_loadfile和luaL_dofile,这些函数非常类似对应的Lua层函数。

loadstring函数

    函数原型如下:

复制代码 代码如下:

loadstring (string [, chunkname]) 

  该函数通用类似于load,它等价于给load函数传递字符串做作为参数。为了加载和运行一个字符串,可以这些写:

复制代码 代码如下:

assert(loadstring(s))() 

注意该函数在Lua5.2被删除了,因为它完全可被load替代。

以上所述就是本文的全部内容了,希望对大家熟练掌握lua能够有所帮助。

相关文章

  • Lua中的模块(module)和包(package)详解

    Lua中的模块(module)和包(package)详解

    这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数、写一个模块、package.loaded、module函数等内容,需要的朋友可以参考下
    2014-09-09
  • Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    这篇文章主要介绍了Cocos2d-x中调用Lua及HelloWorld.lua源码分解,本文最后总结了一些Lua的语法,需要的朋友可以参考下
    2014-09-09
  • C语言中调用Lua函数实例

    C语言中调用Lua函数实例

    这篇文章主要介绍了C语言中调用Lua函数实例,本文讲解了调用一个Lua函数的步骤和C语言调用Lua函数实例,需要的朋友可以参考下
    2015-04-04
  • Lua中使用二维数组实例

    Lua中使用二维数组实例

    这篇文章主要介绍了Lua中使用二维数组实例,本文直接给出代码实例,看代码更容易理解,需要的朋友可以参考下
    2015-06-06
  • Lua实现类继承

    Lua实现类继承

    这里给大家演示的是一个使用lua实现类继承的示例,实现类继承其实有很多种写法,这里是本人常用的方法,推荐给大家。
    2015-03-03
  • Lua调用自定义C模块

    Lua调用自定义C模块

    Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性。对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数。对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式
    2015-09-09
  • Lua中的元表和元方法学习笔记

    Lua中的元表和元方法学习笔记

    这篇文章主要介绍了Lua中的元表和元方法学习笔记,本文主要讲解了getmetatable获取元表、setmetatable修改元表等内容,需要的朋友可以参考下
    2014-12-12
  • Lua中string.lower()使用指南

    Lua中string.lower()使用指南

    这篇文章主要介绍了Lua中操作字符串的基本方法整理,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2016-08-08
  • phpredis执行LUA脚本示例代码

    phpredis执行LUA脚本示例代码

    这篇文章主要给大家介绍了关于phpredis执行LUA脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • lua脚本语言快速入门教程

    lua脚本语言快速入门教程

    这篇文章主要介绍了lua脚本语言快速入门教程,本文讲解了变量及常量、字符串、逻辑控制语句、循环结构、函数及其使用等内容,需要的朋友可以参考下
    2015-03-03

最新评论