开发工具:
文件大小: 1mb
下载次数: 0
上传时间: 2019-08-18
详细说明:
lua开发文档2019/8/18
Lua53参考手册
索引一张表的原则遵循语言中的直接比较规则。当且仅当i与j直接比较相等时(即不通
过元方法的比较),表达式a[订与a[j表示了表中相同的元素。特别指出:一个可以完
全表示为整数的浮点数和对应的整数相等(例如:1.0==1)。为了消除歧义,当一个
可以完全表示为整数的浮点数做为键值时,都会被转换为对应的整数储存。例如,当你
写a[2.0]=true时,实际被插入表中的键是整数2。(另一方面,2与"2"是两个不
同的Lua值,故而它们可以是同一张表中的不同项。)
表、函数、线程、以及完全用户数据在Lua中被称为劝彖:变量并不真的持有它们的
值,而仅保存了对这些对象的引/赋值、参数传递、函数返回,都是针对引用而不是
针对值的操作,这些操作均不会做任何形式的隐式拷贝。
库函数type用于以字符串形式返回给定值的类型。(参见§6,1)。
2.2-环境与全局环境
后面在§32以及§333会讨论,引用一个叫var的自由名字(指在任何层级都未被声明
的名字)在句法上都被翻译为ENV.var。此外,每个被编译的Lua代码块都会有一个
外部的局部变量叫_ENV(参见§3.3.2),因此,ENV这个名字永远都不会成为一个
代码块中的自由名字。
在转译那些自由名字时,ENV是否是那个外部的局部变量无所谓。_ENV和其它你可以
使用的变量名没有区别。这里特别指出,你可以定义一个新变量或指定一个参数叫这个名
字。当编译器在转译自由名字时所用到的_ENV,指的是你的程序在那个点上可见的那
个名为ENV的变量。(Lua的可见性规则参见§3.5)
被ENV用于值的那张表被称为环境。
Lua保有—个被称为全局环境特别环境。它被保存在C注册表(参见§4.5)的一个特别
索引下。在凵ua中,全局变量_G被初始化为这个值。(G不被内部任何地方使
用。)
当Lua加载一个代码块,EN这个上值的默认值就是这个全局环境(参见|oad)。因
此,在默认情况下,La代码中提及的自由名字都指的全局环境中的相关项(因此,它们
也被称为全局变量)。此外,所有的标准库都被加载入全局环境,一些函数也针对这个
环境做操作。你可以用load(或 loadfile)加载代码块,并赋予它们不同的环境。(在
C里,当你加载一个代码块后,可以通过改变它的第一个上值来改变它的环境。)
2.3-错误处理
由于Lua是一门嵌入式扩展语言,其所有行为均源于宿主程序中C代码对某个Lua库函
数的调用。(单独使用Lua时,lua程序就是宿主程序。)所以,在编译或运行Lua代
码块的过程中,无论何时发生错误,控制权都返回给宿主,由宿主负责采取恰当的措施
(比如打印错误消息)。
可以在Lua代码中调用 error函数来显式地抛出一个错误。如果你需要在Lua中捕获这
些错误,可以使用pca!或ⅹpca!在馍式下调用一个函数。
https://www.runoab.com/manual/lua53dac/manual.html
3/97
2019/8/18
Lua53参考手册
无论何时出现错误,都会抛出一个携带错误信息的菪对象(淏消息)。Lua本身只
会为错误生成字符串类型的错误对象,但你的程序可以为错误生成任何类型的错误对象,
这就看你的Lua程序或宿主程序如何处理这些错误对象
使用xpca或|ua_pca时,你应该提供一个消息处理函数用于错误抛出时调用。该
函数需接收原始的错误消息,并返回一个新的错误消息。它在错误发生后栈尚未展开时调
用,因此可以利用栈来收集更多的信息,比如通过探知栈来创建一组栈回溯信息。同
时,该处理函数也处于保护模式下,所以该函数内发生的错误会再次触发它(递归)。如
果递归太深,Lua会终止调用并返回一个合适的消息
24-元表及元方法
Lua中的每个值都可以有一个元表这个元表就是一个普通的Lua表,它用于定义原
始值在特定操作下的行为。如果你想改变一个值在特定操作下的行为,你可以在它的元表
中设置对应域。例如,当你对非数字值做加操作时,Lua会检查该值的元表中的
"add"域下的函数。如果能找到,Lua则调用这个函数来完成加这个操作。
元表中的键对应着不同的萝仵名;键关联的那些值被称为元方法。在上面那个例子中
引用的事件为"add",完成加操作的那个函数就是元方法。
你可以用 getmetatable函数来获取任何值的元表。
使用 setmetatable来替换一张表的元表。在Lua中,你不可以改变表以外其它类型的值
的元表(除非你使用调试库(参见§6.10));若想改变这些非表类型的值的元表,请使
用CAPI。
表和完全用户数据有独立的元表(当然,多个表和用户数据可以共享同一个元表)。其
它类型的值按类型共亨元表;也就是说所有的数字都共亨同一个元表,所有的字符串共
享另一个元表等等。默认情况下,值是没有元表的,但字符串库在初始化的时候为字符
串类型设置了元表(参见§64)。
元表决定了一个对象在数学运算、位运算、比较、连接、取长度、调用、索引时的行为。
元表还可以定义一个函数,当表对象或用户数据对象在垃圾回收(参见§25)时调用它。
接下来会给出一张元表可以控制的事件的完整列表。每个操作都用对应的事件名来区分。
每个事件的键名用加有'’前缀的字符串来表示;例如"add"操作的键名为字符串
"add"。注意、Lua从元表中直接获取元方法;访问元表中的元方法永远不会触发另
一次元方法。下面的代码模拟了Lua从一个对象obj中获取一个元方法的过程:
rawget(getmetatable(objor (, .. event_name)
对于一元操作符(取负、求长度、位反),元方法调用的时候,第二个参数是个哑元,其
值等于第一个参数。这样处理仅仅是为了简化Lua的内部实现(这样处理可以让所有的
操作都和二元操作一致),这个行为有可能在将来的版本中移除。(使用这个额外参数
的行为都是不确定的。)
ada"∷:+操作。如果仼何不是数字的值(包括不能转换为数字的字符串)做加
法,Lua就会尝试调用元方法。首先、Lua检查第一个操作数(即使它是合法
的),如果这个操作数没有为"_add"事件定义元方法,La就会接着检査第二
个操作数。一旦Lua找到了元方法,它将把两个操作数作为参数传入元方法,元
https://www.runoab.com/manual/lua53dac/manual.html
4/97
2019/8/18
Lua53参考手册
方法的结果(调整为单个值)作为这个操作的结果。如果找不到元方法,将抛出·
个错误。
"sub":-操作。行为和"add"操作类似。
"mu":*操作。行为和"add"操作类似。
"div":/操作。行为和"add"操作类似。
·"mod":%操作。行为和"add"操作类似。
pow":^(次方)操作。行为和"add"操作类似
·"unm":-(取负)操作。行为和"add"操作类似。
idiv"://(向下取整除法)操作。行为和"add"操作类似。
"band":&(按位与)操作。行为和"ad"操作类似,不同的是Lua会在任何-
个操作数无法转换为整数时(参见§34.3)尝试取元方法。
·"bor":|(按位或)操作。行为和"band"操作类似。
bxor":~(按位异或)操作。行为和"band"操作类似。
"bnot":~(按位非)操作。行为和"band"操作类似。
sh":<<(左移)操作。行为和"band"操作类似。
"shr"∷:>>(右移)操作。行为和"band"操作类似。
concat"::(连接)操作。行为和"add"操作类似,不同的是Lua在任何操作
数即不是一个字符串也不是数字(数字总能转换为对应的字符串)的情况下尝试元
方法。
·"len":#(取长度)操作。如果对象不是字符串,Lua会尝试它的元方法。如果有
元方法,则调用它并将对象以参数形式传入,而返回值(被调整为单个)则作为结
果。如果对象是一张表且没有元方法,Lua使用表的取长度操作(参见§34.7)。
其它情况,均抛出错误。
·"eq":==(等于)操作。和"ad"操作行为类似,不同的是Lua仅在两个值都
是表或都是完全用户数据且它们不是同一个对象时才尝试元方法。调用的结果总会
被转换为布尔量。
"It":<(小于)操作。和"ad"操作行为类似,不同的是Lua仅在两个值不全为
整数也不全为字符串时才尝试元方法。调用的结果总会被转换为布尔量。
·"le"∷:<=(小于等于)操作。和其它操作不同,小于等于操作可能用到两个不同
的事件。首先,像"It"操作的行为那样,Lua在两个操作数中查找"_le"元方
法。如果一个元方法都找不到,就会再次查找"t"事件,它会假设a<=b等
价于not(b
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.