Lua 5.3 参考手册

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Lua5.3参考手册作者RobertoIerusalimschy,LuizHenriquedeFigueiredo,WaldemarCeles译者云风Lua.org,PUC-Rio版权所有©2015,在遵循Lualicense条款下,可自由使用。目录·索引·中英术语对照表1–简介Lua是一门扩展式程序设计语言,被设计成支持通用过程式编程,并有相关数据描述设施。同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。Lua由cleanC(标准C和C++间共通的子集)实现成一个库。作为一门扩展式语言,Lua没有main程序的概念:它只能嵌入一个宿主程序中工作,该宿主程序被称为被嵌入程序或者简称宿主。宿主程序可以调用函数执行一小段Lua代码,可以读写Lua变量,可以注册C函数让Lua代码调用。依靠C函数,Lua可以共享相同的语法框架来定制编程语言,从而适用不同的领域。Lua的官方发布版包含一个叫做lua的宿主程序示例,它是一个利用Lua库实现的完整独立的Lua解释器,可用于交互式应用或批处理。Lua是一个自由软件,其使用许可证决定了它的使用过程无需任何担保。本手册所描述的实现可以在Lua的官方网站找到。与其它的许多参考手册一样,这份文档有些地方比较枯燥。关于Lua背后的设计思想,可以看看Lua网站上提供的技术论文。至于用Lua编程的细节介绍,请参阅Roberto的书,ProgramminginLua。2–基本概念本章描述了语言的基本概念。2.1–值与类型Lua是一门动态类型语言。这意味着变量没有类型;只有值才有类型。语言中不设类型定义。所有的值携带自己的类型。Lua中所有的值都是一等公民。这意味着所有的值均可保存在变量中、当作参数传递给其它函数、以及作为返回值。Lua中有八种基本类型:nil、boolean、number、string、function、userdata、thread和table。Nil是值nil的类型,其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。Boolean是false与true两个值的类型。nil和false都会导致条件判断为假;而其它任何值都表示为真。Number代表了整数和实数(浮点数)。String表示一个不可变的字节序列。Lua对8位是友好的:字符串可以容纳任意8位值,其中包含零('\0')。Lua的字符串与编码无关;它不关心字符串中具体内容。number类型有两种内部表现方式,整数和浮点数。对于何时使用哪种内部形式,Lua有明确的规则,但它也按需(参见§3.4.3)作自动转换。因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。标准Lua使用64位整数和双精度(64位)浮点数,但你也可以把Lua编译成使用32位整数和单精度(32位)浮点数。以32位表示数字对小型机器以及嵌入式系统特别合适。(参见luaconf.h文件中的宏LUA_32BITS。)Lua可以调用(以及操作)用Lua或C(参见§3.4.10)编写的函数。这两种函数有统一类型function。userdata类型允许将C中的数据保存在Lua变量中。用户数据类型的值是一个内存块,有两种用户数据:完全用户数据,指一块由Lua管理的内存对应的对象;轻量用户数据,则指一个简单的C指针。用户数据在Lua中除了赋值与相等性判断之外没有其他预定义的操作。通过使用元表,程序员可以给完全用户数据定义一系列的操作(参见§2.4)。你只能通过CAPI而无法在Lua代码中创建或者修改用户数据的值,这保证了数据仅被宿主程序所控制。thread类型表示了一个独立的执行序列,被用于实现协程(参见§2.6)。Lua的线程与操作系统的线程毫无关系。Lua为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。table是一个关联数组,也就是说,这个数组不仅仅以数字做索引,除了nil和NaN之外的所有Lua值都可以做索引。(NotaNumber是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如0/0。)表可以是异构的;也就是说,表内可以包含任何类型的值(nil除外)。任何键的值若为nil就不会被记入表结构内部。换言之,对于表内不存在的键,都对应着值nil。表是Lua中唯一的数据结构,它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。对于记录,Lua使用域名作为索引。语言提供了a.name这样的语法糖来替代a[name]这种写法以方便记录这种结构的使用。在Lua中有多种便利的方式创建表(参见§3.4.9)。我们使用序列这个术语来表示一个用{1..n}的正整数集做索引的表。这里的非负整数n被称为该序列的长度(参见§3.4.7)。和索引一样,表中每个域的值也可以是任何类型。需要特别指出的是:既然函数是一等公民,那么表的域也可以是函数。这样,表就可以携带方法了。(参见§3.4.11)。索引一张表的原则遵循语言中的直接比较规则。当且仅当i与j直接比较相等时(即不通过元方法的比较),表达式a[i]与a[j]表示了表中相同的元素。特别指出:一个可以完全表示为整数的浮点数和对应的整数相等(例如:1.0==1)。为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时,都会被转换为对应的整数储存。例如,当你写a[2.0]=true时,实际被插入表中的键是整数2。(另一方面,2与2是两个不同的Lua值,故而它们可以是同一张表中的不同项。)表、函数、线程、以及完全用户数据在Lua中被称为对象:变量并不真的持有它们的值,而仅保存了对这些对象的引用。赋值、参数传递、函数返回,都是针对引用而不是针对值的操作,这些操作均不会做任何形式的隐式拷贝。库函数type用于以字符串形式返回给定值的类型。(参见§6.1)。2.2–环境与全局环境后面在§3.2以及§3.3.3会讨论,引用一个叫var的自由名字(指在任何层级都未被声明的名字)在句法上都被翻译为_ENV.var。此外,每个被编译的Lua代码块都会有一个外部的局部变量叫_ENV(参见§3.3.2),因此,_ENV这个名字永远都不会成为一个代码块中的自由名字。在转译那些自由名字时,_ENV是否是那个外部的局部变量无所谓。_ENV和其它你可以使用的变量名没有区别。这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。当编译器在转译自由名字时所用到的_ENV,指的是你的程序在那个点上可见的那个名为_ENV的变量。(Lua的可见性规则参见§3.5)被_ENV用于值的那张表被称为环境。Lua保有一个被称为全局环境特别环境。它被保存在C注册表(参见§4.5)的一个特别索引下。在Lua中,全局变量_G被初始化为这个值。(_G不被内部任何地方使用。)当Lua加载一个代码块,_ENV这个上值的默认值就是这个全局环境(参见load)。因此,在默认情况下,Lua代码中提及的自由名字都指的全局环境中的相关项(因此,它们也被称为全局变量)。此外,所有的标准库都被加载入全局环境,一些函数也针对这个环境做操作。你可以用load(或loadfile)加载代码块,并赋予它们不同的环境。(在C里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)2.3–错误处理由于Lua是一门嵌入式扩展语言,其所有行为均源于宿主程序中C代码对某个Lua库函数的调用。(单独使用Lua时,lua程序就是宿主程序。)所以,在编译或运行Lua代码块的过程中,无论何时发生错误,控制权都返回给宿主,由宿主负责采取恰当的措施(比如打印错误消息)。可以在Lua代码中调用error函数来显式地抛出一个错误。如果你需要在Lua中捕获这些错误,可以使用pcall或xpcall在保护模式下调用一个函数。无论何时出现错误,都会抛出一个携带错误信息的错误对象(错误消息)。Lua本身只会为错误生成字符串类型的错误对象,但你的程序可以为错误生成任何类型的错误对象,这就看你的Lua程序或宿主程序如何处理这些错误对象。使用xpcall或lua_pcall时,你应该提供一个消息处理函数用于错误抛出时调用。该函数需接收原始的错误消息,并返回一个新的错误消息。它在错误发生后栈尚未展开时调用,因此可以利用栈来收集更多的信息,比如通过探知栈来创建一组栈回溯信息。同时,该处理函数也处于保护模式下,所以该函数内发生的错误会再次触发它(递归)。如果递归太深,Lua会终止调用并返回一个合适的消息。2.4–元表及元方法Lua中的每个值都可以有一个元表。这个元表就是一个普通的Lua表,它用于定义原始值在特定操作下的行为。如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。例如,当你对非数字值做加操作时,Lua会检查该值的元表中的__add域下的函数。如果能找到,Lua则调用这个函数来完成加这个操作。元表中的键对应着不同的事件名;键关联的那些值被称为元方法。在上面那个例子中引用的事件为add,完成加操作的那个函数就是元方法。你可以用getmetatable函数来获取任何值的元表。使用setmetatable来替换一张表的元表。在Lua中,你不可以改变表以外其它类型的值的元表(除非你使用调试库(参见§6.10));若想改变这些非表类型的值的元表,请使用CAPI。表和完全用户数据有独立的元表(当然,多个表和用户数据可以共享同一个元表)。其它类型的值按类型共享元表;也就是说所有的数字都共享同一个元表,所有的字符串共享另一个元表等等。默认情况下,值是没有元表的,但字符串库在初始化的时候为字符串类型设置了元表(参见§6.4)。元表决定了一个对象在数学运算、位运算、比较、连接、取长度、调用、索引时的行为。元表还可以定义一个函数,当表对象或用户数据对象在垃圾回收(参见§2.5)时调用它。接下来会给出一张元表可以控制的事件的完整列表。每个操作都用对应的事件名来区分。每个事件的键名用加有'__'前缀的字符串来表示;例如add操作的键名为字符串__add。注意、Lua从元表中直接获取元方法;访问元表中的元方法永远不会触发另一次元方法。下面的代码模拟了Lua从一个对象obj中获取一个元方法的过程:rawget(getmetatable(obj)or{},__..event_name)对于一元操作符(取负、求长度、位反),元方法调用的时候,第二个参数是个哑元,其值等于第一个参数。这样处理仅仅是为了简化Lua的内部实现(这样处理可以让所有的操作都和二元操作一致),这个行为有可能在将来的版本中移除。(使用这个额外参数的行为都是不确定的。)add:+操作。如果任何不是数字的值(包括不能转换为数字的字符串)做加法,Lua就会尝试调用元方法。首先、Lua检查第一个操作数(即使它是合法的),如果这个操作数没有为__add事件定义元方法,Lua就会接着检查第二个操作数。一旦Lua找到了元方法,它将把两个操作数作为参数传入元方法,元方法的结果(调整为单个值)作为这个操作的结果。如果找不到元方法,将抛出一个错误。sub:-操作。行为和add操作类似。mul:*操作。行为和add操作类似。div:/操作。行为和add操作类似。mod:%操作。行为和add操作类似。pow:^(次方)操作。行为和add操作类似。unm:-(取负)操作。行为和add操作类似。idiv://(向下取整除法)操作。行为和add操作类似。band:&(按位与)操作。行为和add操作类似,不同的是Lua会在任何一个操作数无法转换为整数时(参见§3.4.3)尝试取元方法。bor:|(按位或)操作。行为和band操作类似。bxor:~(按位异或)操作。行为和band操作类似。bnot:~(按位非)操作。行为和band操作类似。shl:(左移)操作。行为和band操作类似。shr:(右移)操作。行为和band操作类似。concat:..(连接)操作。行为和add操作

1 / 204
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功