Lua的编译、执行和调试技术介绍_Lua

dofile读入文件编译并执行,真正完成功能的函数是loadfile;与dofile不同,loadfile仅仅是编译代码成中间码,并且把编译后的chunk作为函数返回。如果发生错误,返回nil和错误信息。我们可以这么定义dofile:

复制代码 代码如下:

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

如果你只调用一次,可以使用dofile(filename),如果是调用多次,可以f = loadfile(filename); f();f()...

loadstring与loadfile相似,只不过他是从一个串中读入。

lua中函数定义发生在运行时而不是编译时。

复制代码 代码如下:

f = loadstring("i=i+1")
与f = function() i = i+1 end等价。但loadstring不关心词法范围:
i = 33
local i = 0;
f = loadstring("i=i+1")
g = function() i = i+1 end

g使用的是局部变量i,而f使用的是全局变量i,因为f总是在全局环境下编译。

犯错是人的本性,因此我们必须以最佳的方式来处理错误。lua作为扩展语言,经常嵌入到其他应用,当错误发生时,不能简单的crash或exit。

复制代码 代码如下:

print "enter a number:"
n = io.read("*number")
if not n then error("invalid input") end

if not condition then error end 的组合太普遍了以至于lua专门内建了一个函数来做这工作,这个函数就是assert。

通常,当异常发生时,你有两个方式处理,要么返回错误码(nil),要么报错(error)。对于这两种方式,并没有固定的准则来做选择。但是我们提供通用的原则:容易避免的异常应该报错,否则返回异常。举例说明:

math.sin接受个number型的弧度值,如果参数不是number,我们应该报错,而不是返回错误码。假设我们是返回错误码,那么我们使用就得这样:

复制代码 代码如下:

local res = math.sin(x)
if not res then
     <error handling>

其实,我们可以很容易地检测这个异常,在调用sin之前:

复制代码 代码如下:

if not tonumber(x) then
     <error handling>

通常,我们是既不检测sin的参数,也不检测sin的返回值。如果参数不是number,往往是我们代码自身出问题了。这种情况下,停止执行并报错是最简单也是最实用的方式。

相反的,io.open这个函数,就不存在简单的在调用open之前就检测出异常的方法。打开失败可能是因为文件不存在,或权限不够。通过返回错误码,你可以采用适当的方式来处理,比如让用户输入另一个文件名。

时间: 2024-10-01 10:37:01

Lua的编译、执行和调试技术介绍_Lua的相关文章

Lua中的迭代器和泛型for介绍_Lua

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器.lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素.每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代.对于这样的任务,闭包提供了很好的机制来完成.一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂. 例如,我们可以写过简单的list迭代器,让他仅仅返回值. 复制代码 代码如下: function values( t )      local i = 0;      retu

Lua中全局变量与非全局环境介绍_Lua

今天来聊两个话题--全局变量和非全局环境. 正如大家目前心里所感受到的,全局变量的内容很简单,而非全局环境的内容就稍微要锻炼一下脑细胞了. 1.全局变量的原形 在Lua中,要声明全局变量很简单,那就是定义变量的时候,前面不要加上local. 这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了. 而这个table的名字是:_G   我们来看看代码: 复制代码 代码如下:     -- 定义一个全局变量     gName = "哎哟,很挫哦"

JAVA 文件编译执行与虚拟机(JVM)简单介绍

java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明.    一.Java源文件的编译.下载.解释和执行  Java应用程序的开发周期包括编译.下载.解释和执行几个部分.Java编译程序将Java源程序翻译为JVM可执行代码?字节码.

动态网页PHP程序员的优化调试技术和技巧

本文介绍调试PHP应用程序的各种方法,包括在Apache and PHP中打开错误报告,以及通过在一个简单的PHP脚本中放置策略性的print语句,找到更困难的bug的源头.还会介绍用于Eclipse的PHPEclipse插件,这是一个灵活的开发环境,具有实时语法解析能力,还会介绍PHPEclipse的DBG调试器扩展. 简介 有许多 PHP 调试技术可以在编码的时候节约大量时间.一个有效却很基本的调试技术就是打开错误报告.另一个略微高级一点的技术包括使用 print 语句,通过显示在屏幕上实际

Asp.net 3.5控件和组件开发技术系列—服务器控件开发中的调试技术

本章内容 2.1 预置代码示例 2.2 调试页面服务端代码 2.3 服务器控件的调试 2.4 JavaScript 脚本调试方法 2.5 Ajax Library 对JavaScript调试支持 2.1 预置代码示例 熟悉ASP.NET 开发的读者朋友可能对于服务器控件的调试技术更容易上手,不过如果您刚刚接 触ASP.NET 也没关系,本章会从最基本的调试开始讲解. 在调试之前,要先建立一个调试控件的项目环境.关于如何建立环境在这里就不讲了,第1 章 已经讲得非常详细了. 首先在Web 控件项目

JSF技术介绍

与微软Visual Studio.NET程序开发有可视化工具的支持相比,人们在开发基于Java的Web用户界面时仍然需要手工书写大量的标签,同时还要考虑页面状态信息的保存.客户端事件处理等问题,开发难度比较大,效率较低,重用性差.Java Server Faces(JSF)技术正是为了解决这一问题应运而生的,其最引人注目的特性之一是它与标记语言.协议.客户端设备无关.利用JSF提供的可重用.可扩展.基于组件的用户界面框架,在快速开发工具RAD的支持下实现可视化开发.现在JSF技术已经得到了许多大

PHP 程序员的调试技术小结_php技巧

本文介绍调试 PHP 应用程序的各种方法,包括在 Apache and PHP 中打开错误报告,以及通过在一个简单的 PHP 脚本中放置策略性的 print 语句,找到更困难的 bug 的源头.还会介绍用于 Eclipse 的 PHPEclipse 插件,这是一个灵活的开发环境,具有实时语法解析能力,还会介绍 PHPEclipse 的 DBG 调试器扩展. 简介 有许多 PHP 调试技术可以在编码的时候节约大量时间.一个有效却很基本的调试技术就是打开错误报告.另一个略微高级一点的技术包括使用 p

Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍

本文讲的是Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍, 前言 建议阅读本文之前,你对ARM组件的有个基本了解,本文会先为你介绍32位Linux环境中进程的内存布局,然后再介绍堆栈和堆相关内存损坏的基本原理以及调试方法. 本文中使用的示例是在ARMv6 32位处理器上编译的,如果你无法访问ARM设备,可以点击这里https://azeria-labs.com/emulate-raspberry-pi-with-qemu/创建自己的实验环境并在虚拟机中模拟Raspberry Pi发

揭秘浏览器远程调试技术

调试技术的起源 1947 年 9 月 9 日,一名美国的科学家格蕾丝.霍普和她的同伴在对 Mark II 计算机进行研究的时候发现,一只飞蛾粘在一个继电器上,导致计算机无法正常工作,当他们把飞蛾移除之后,计算机又恢复了正常运转.于是他们将这只飞蛾贴在了他们当时记录的日志上,对这件事情进行了详细的记录,并在日志最后写了这样一句话:First actual case of bug being found.这是他们发现的第一个真正意义上的 bug,这也是人类计算机软件历史上,发现的第一个 bug,而他