首页 > 作文

荐 LUA教程编译·运行·错误信息

更新时间:2023-04-08 20:02:23 阅读: 评论:0

虽然我们把Lua当作解释型语言,但是Lua会首先把代码预编译成中间码然后再执行(很多解释型语junshi1言都是这么做的)。在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快。我们可以说函数dofile的存在就是说明可以将Lua作为一种解释型语言被调用。

前面我们介绍过dofile,把它当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误码。我们可以这样定义dofile:

function dofile (filename)    local f = asrt(loadfile(filename))    return f()end

如果loadfile失败asrt会抛出错误。

完成简单的功能dofile比较方便,他读入文件编译并且执行。然而loadfile更加灵活。在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理。另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行。dofile却每次都要编译。

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

f = loadstring("i = i + 1")

f将是一个函数,调用时执行i=i+1。

i = 0f(); print(i)     --> 1f(); 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(s)()

调用loadstring返回的结果,然而如果加载的内容存在语法错误的话,loadstring返回nil和错误信息(attempt to c红星照耀中国的作者all a nil value);为了返回更清楚的错误信息可以使用asrt:

asrt(loadstring(s))()

通常使用loadstring加载一个字串没什么意义,例如:

f = loadstring("i = i + 1")

大概与f = function () i = i + 1 end等价,但是第二段代码速度更快因为它只需要编译一次,第一段代码每次调用loadstring都会重新编译,还有一个重要区别:loadstring编译的时候不关心词法范围:

local i = 0f = loadstring("i = i + 1")g = function () i = i + 1 end

这个例子中,和想象的一样g使用局部变量i,然而f使用全局变量i;loadstring总是在全局环境中编译他的串。
loadstring通常用于运行程序外部的代码,比如运行用户自定义的代码。注意:loadstring期望一个chunk,即语句。如果想要加载表达式,需要在表达式前加return,那样将返回表达式的值。看例子:

print "enter your expression:"local l = io.read()local func = asrt(loadstring("return " .. l))print("the value of your expression i初中教师节手抄报s " .. func())

loadstring返回的函数和普通函数一样,可以多次被调用:

print "enter function to be plotted (with variable 'x'):"local l = io.read()local f = asrt(loadstring("return " .. l))for i=1,20 do    x = i   -- global 'x' (to be visible from the chunk)    print(string.rep("*", f()))end

原文:LUA一个小巧脚本语言学习笔记

LUA教程编译·运行·错误信息-29

本文地址:https://blo钢琴教师简介g.csdn.net/zcp528/article/details/107310491

本文发布于:2023-04-08 20:02:22,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/d20da18a9846fb244ce475fe6268becd.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:荐 LUA教程编译·运行·错误信息.doc

本文 PDF 下载地址:荐 LUA教程编译·运行·错误信息.pdf

标签:函数   错误信息   代码   定义
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图