8.编译,执行,与错误

8.编译,执行,与错误

ID:21033515

大小:58.00 KB

页数:6页

时间:2018-10-18

8.编译,执行,与错误_第1页
8.编译,执行,与错误_第2页
8.编译,执行,与错误_第3页
8.编译,执行,与错误_第4页
8.编译,执行,与错误_第5页
资源描述:

《8.编译,执行,与错误》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、虽然我们把Lua当作解释型语言,但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的).在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快.我们可以说函数dofile的存在就是说明可以将Lua作为一种解释型语言被调用.      前面我们介绍过dofile,把它当作Lua运行代码的chunk的一种原始的操作.dofile实际上是一个辅助的函数,真正完成功能的函数是loadfile;与dofile不同的是loa

2、dfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误代码.我们可以这样定义dofile:             functiondofile(filename)           localf=assert(loadfile(filename))           returnf()         end      如果loadfile失败assert会抛出错误.      完成简单的功能dofile比较方便,他读入文件编译并且执行.然而loadf

3、ile更加灵活.在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理.另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行.dofile却每次都要编译.      loadstring与loadfile相似,只不过它不是从文件里读入chunk,而是从一个串中读入.例如:             f=loadstring("i=i+1")      f将是一个函数,调用时执行:i=i+1:             i=0         f();print(i)  -->

4、1         f();print(i)  -->2      loadstring函数功能强大,但使用时需多加小心.确认没有其它简单的解决问题的方法再使用.      Lua把每一个chunk都作为一个匿名函数处理.例如:chunk"a=1",loadstring返回与其等价的function()a=1end      与其他函数一样,chunks可以定义局部变量也可以返回值:             f=loadstring("locala=10;returna+20")         print(f())       

5、  -->30      loadfile和loadstring都不会抛出错误,如果发生错误他们将返回nil加上错误信息:             print(loadstring("ii"))        -->nil    [string"ii"]:1:`='expectednear`i'      另外,loadfile和loadstring都不会有边界效应产生,他们仅仅编译chunk成为自己内部实现的一个匿名函数.通常对他们的误解是他们定义了函数.Lua中的函数定义是发生在运行时的赋值而不是发生在编译时.假如我们有一个文

6、件foo.lua:             --file`foo.lua'         functionfoo(x)           print(x)         end      当我们执行命令f=loadfile("foo.lua")后,foo被编译了但还没有被定义,如果要定义他必须运行chunk:             f()          --defines`foo'         foo("ok")    -->ok      如果你想快捷的调用dostring(比如加载并运行)可以调用loadstr

7、ing 返回的结果loadstring(s)(),然而如果加载的内容存在语法错误的话,loadstring返回nil和错误信息(attempttocallanilvalue);为了返回更清楚的错误信息可以使用assert:             assert(loadstring(s))()      通常使用loadstring加载一个字串没什么意义,例如:             f=loadstring("i=i+1")      大概与f=function()i=i+1end等价,但是第二段代码速度更快因为它只需要编译一

8、次,第一段代码每次调用loadstring都会重新编译,还有一个重要区别:loadstring编译的时候不关心词法范围:             locali=0         f=loadstring("i=i+1")         g=fu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。