- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8编译,执行,和错误.
虽然我们把Lua当作解释型语言,但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的).在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快.我们可以说函数dofile的存在就是说明可以将Lua作为一种解释型语言被调用.
?????? 前面我们介绍过dofile,把它当作Lua运行代码的chunk的一种原始的操作.dofile实际上是一个辅助的函数,真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误代码.我们可以这样定义dofile:
????????????? function dofile (filename)
??? ?????? ??local f = assert(loadfile(filename))
??? ?????? ??return f()
??? ?????? end
?????? 如果loadfile失败assert会抛出错误.
?????? 完成简单的功能dofile比较方便,他读入文件编译并且执行.然而loadfile更加灵活.在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理.另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行.dofile却每次都要编译.
?????? loadstring与loadfile相似,只不过它不是从文件里读入chunk,而是从一个串中读入.例如:
????????????? f = loadstring(i = i + 1)
?????? f将是一个函数,调用时执行:i=i+1:
????????????? i = 0
??? ?????? f(); print(i)?? -- 1
??? ?????? f(); print(i)?? -- 2
?????? loadstring函数功能强大,但使用时需多加小心.确认没有其它简单的解决问题的方法再使用.
?????? Lua把每一个chunk都作为一个匿名函数处理.例如:chunk a = 1,loadstring返回与其等价的function () a = 1 end
?????? 与其他函数一样,chunks可以定义局部变量也可以返回值:
????????????? f = loadstring(local a = 10; return a + 20)
??? ?????? print(f())????????? -- 30
?????? loadfile和loadstring都不会抛出错误,如果发生错误他们将返回nil加上错误信息:
????????????? print(loadstring(i i))
????? ??? -- nil???? [string i i]:1: `= expected near `i
?????? 另外,loadfile和loadstring都不会有边界效应产生,他们仅仅编译chunk成为自己内部实现的一个匿名函数.通常对他们的误解是他们定义了函数.Lua中的函数定义是发生在运行时的赋值而不是发生在编译时.假如我们有一个文件foo.lua:
????????????? -- file `foo.lua
??? ?????? function foo (x)
??? ?????? ??print(x)
??? ?????? end
?????? 当我们执行命令f = loadfile(foo.lua)后,foo被编译了但还没有被定义,如果要定义他必须运行chunk:
????????????? f()?????????? -- defines `foo
??? ?????? foo(ok)???? -- ok
?????? 如果你想快捷的调用dostring (比如加载并运行)可以调用loadstring? 返回的结果loadstring(s)(),然而如果加载的内容存在语法错误的话,loadstring返回nil和错误信息(attempt to call a nil value);为了返回更清楚的错误信息可以使用assert:
????????????? assert(loadstring(s))()
?????? 通常使用loadstring加载一个字串没什么意义,例如:
????????????? f = loadstring(i = i + 1)
?????? 大概与f = function () i = i + 1 end等价,但是第二段代码速度
您可能关注的文档
最近下载
- TCPRA 4000.9-2025 文化数据服务平台技术要求 第9部分:运维管理系统.docx VIP
- 2025年部编六上语文《草原》公开课教案教学设计【一等奖】.pdf VIP
- 《直播电商基础与实务》-教案 项目8直播电商平台运营实战-教案.doc
- 抗凝药物临床应用指南.pptx VIP
- 学堂在线《医学科研设计》作业单元考核答案.docx VIP
- 庞加莱猜想证明概述.pdf VIP
- 2024年秋季新人教版9年级上册化学全册课件.pptx
- 药物化学 磺胺类药物及抗菌增效剂 磺胺类药物及抗菌增效剂 电子教案.doc VIP
- 高中地理校本课程教案.docx VIP
- 2024年山东成人学士学位英语考试真题解析 .docx VIP
文档评论(0)