• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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中使用元表(metatable)执行算术类元方法实例
    • Lua中的源代码预编译浅析
    • Lua简介、编译安装教程及变量等语法介绍
    • Mac平台中编译安装Lua运行环境及Hello Lua实例
    上一篇:Lua源码中字符串类型的实现
    下一篇:lua开发中实现MVC框架的简单应用
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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