8编译,执行,和错误..docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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等价,但是第二段代码速度

文档评论(0)

gangshou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档