可以说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默认值是html" target="_blank">变量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 与 C/C++ 交互 下一章:LuaJIT 介绍
我们目前在Java8中编译了代码,但我们在Java11 VM上运行它。现在我们也在尝试将代码移动到Java11编译时。想知道在Java8中编译代码与在Java11中编译代码在性能方面是否有任何好处,因为两个编译器都会生成不同的类文件(字节码)?在效率方面,一个与另一个有何不同?
我已经用google的nacl编译器编译了一些Qt代码,但是ncval验证器不能运行它。许多例子中的一个: 以下是相关代码: 编译为: 在49b检查调用指令:这是验证器无法理解的。到底是什么会导致编译器发出一条调用自身中间的指令?有办法解决这个问题吗?我用-g-O0-fno-inline编译过。编译器错误?
我是Cassandra的新手,我正在尝试创建一个用户定义的聚合,但一直停留在函数创建上。 表中数据为- 我正在编写的函数将计算特定主机的表中有多少行。如果我为聚合提供test_host1,理想的结果将是3。 在下面找到函数的代码- 在cqlsh上执行此操作时,我得到以下错误- InvalidRequest:code=2200[无效查询]message=“无法从Java源代码org.apache.c
3.3 编译和执行源码 导入成功之后,应该就没有编译错误了!此时你可以运行一下webmagic-core项目中自带的exmaple:"us.codecraft.webmagic.processor.example.GithubRepoPageProcessor"。 同样,看到控制台输出如下,则表示源码编译和执行成功了!
本文向大家介绍lua中赋值类型代码详解,包括了lua中赋值类型代码详解的使用技巧和注意事项,需要的朋友参考一下 我们来看看lua vm在解析下面源码并生成bytecode时的整个过程: 首先我们先使用ChunkySpy这个工具来看看vm最终会具体生成什么样的vm instructions 在这里,开头为[数字]的行是vm真正生成的字节码,我们看到一共生成了六行字节码。首先loadk将常量表中下标为