Lua dofile loadfile loadstring 区别

dofile,把它当作 Lua 运行代码的 chunk 的一种原始的操作。

1. dofile 实际上是一个辅助的函数。真正完成功能的函数是 loadfile;

2.与 dofile 不同的是 loadfile 编译代码成中间码并且返回编译后的 chunk 作为一个函数,而不执行代码;

3. loadfile 不会抛出错误信息而是返回错误码。

将TestMain中的Print.lua改成otherPrint.lua(该lua文件不存在),结果如上,loadfile返回错误码和错误信息,dofile却抛出异常了,所以没有打印出----------B-----------

4.loadfile只需要编译一次,可以多次运行;dofile却要每次都编译(适用于完成比较简单的功能)。

根据以上四条,对于loadfile,我们可以认为是这样定义的:

Lua 把每一个 chunk 都作为一个匿名函数处理:

假如我们有一个文件 foo.lua:

当我们执行命令 f = loadfile("foo.lua")后,foo 被编译了但还没有被定义,如果要定 义他必须运行 chunk:

loadstring 与 loadfile 相似,只不过它不是从文件里读入 chunk,而是从一个串中读入;

loadstring 编译的时候不关心词法范围:

这个例子中,和想象的一样 g 使用局部变量 i,然而 f 使用全局变量 i;loadstring 总 是在全局环境中编译他的串。

时间: 2024-10-18 16:29:30

Lua dofile loadfile loadstring 区别的相关文章

关于Assembly.LoadFrom和Assembly.LoadFile的区别

区别: 1.Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入. Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入. 2.用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如a.dll有两个版本(版本1在

关于lua中的loadstring

f = loadstring("i=i+1")基本等价于f = function() i=i+1 end 但是第二段代码比第一段代码要快得多,因为它只在编译对应程序块时被编译一次,而第一段代码却在 每次调用loadstring时都被编译,由于loadstring每次编译时不涉及词法域,所以上述两段代码并不等价,如下所示: i = 32 local i = 0 f = loadstring("i = i + 1;print(i)") g = function() i

Assembly.LoadFrom()和Assembly.LoadFile()的区别

System.Reflection.Assembly类有两个静态方法:Assembly.Load(string assemblyname)和Assembly.LoadFrom(string filename) .通常用这两个方法把程序集加载到应用程序域中. 如果你希望加载的程序集超出了CLR的预定探查范围,你可以用 Assembly.LoadFrom直接从一个文件位置加载程序集.Assembly.LoadFrom()和Assembly.LoadFile(),两者的主要区别有两点: 一:Assem

lua中.he :的区别

1 local myTable = {} 2 3 function myTable:putMyname(val) 4 print(val) 5 print(self and self.name) 6 end 7 8 myTable.name = "Mical" 9 myTable:putMyname() 10 --结果:nil 11 -- Mical 12 13 --说明“:”调用时传了一个默认参数self进去,并在用":"定义的函数内可使用,且这个参数不能被&qu

lua 环境探索

什么是环境? http://www.lua.org/manual/5.1/manual.html#2.9 Besides metatables, objects of types thread, function, and userdata have another table associated with them, called their environment. Like metatables, environments are regular tables and multiple

Lua基础(转)

局部定义与代码块: 使用local声明一个局部变量或局部函数,局部对象只在被声明的那个代码块中有效. 代码块:一个控制结构.一个函数体.一个chunk(一个文件或文本串)(Lua把chunk当做函数处理) 这样,可以在chunk内部声明局部函数,该函数仅在chunk内可见,并且词法定界保证了包内其他函数可以调用此函数.  在chunk内部定义多个local function并且相互调用(或定义local递归调用函数)时,最好先声明,再定义. 应该尽可能的使用局部变量(使用关键词local声明的变

lua 5.1语法约定

Lua 5.1参考手册 由罗伯特·Ierusalimschy路易斯Henrique de Figueiredo沃尔德蔡氏 ?一个版权?2006 A¢A€"2012 Lua.org,银行业者.免费的根据Lua许可证. 内容一个?·指数一个?·其他版本一个?·英语一个?·portuguA?Aa年代一个?·espaA?A±ol 1 A¢A€"介绍 Lua是一个扩展编程语言设计的支持一般过程式编程与数据描述设施.它还提供了很好的支持面向对象编程,函数式编程,数据驱动的编程.Lua是打算作为一个

Lua 语言 15 分钟快速入门【译】

原文网址:http://defsniky.com/posts/2014-06-05-learn-lua-in-15-minutes.html 英文网址:http://tylerneylon.com/a/learn-lua/ -- 单行注释 --[[ [多行注释] --]] ---------- - 1. 变量 & 控制流 ---------- num = 23 -- 数字都是双精度 str = 'aspythonstring' -- 像 Python 一样不可变 str = "aspyt

wireshark lua脚本

1.目的:解析rssp2协议 2.如何使用wireshark lua插件 将编写的(假设为rssp2.lua)lua文本,放入wireshark 安装目录下,放哪里都行只要dofile添加了路径. 并且在安装目录下找到init.lua,最后一行添加路径代码 : dofile(DATA_DIR.."RSSP2.lua")    3.介绍 解析由rssp2.lua.p2_data.lua.p2_parse.lua3个文件组成.如果协议内容很少,一个lua文件就能完全解决.init.lua会