diff --git a/README.md b/README.md index db37e07..6297874 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ Lua 5.3 手册中文版 -http://cloudwu.github.io/lua53doc +https://cloudwu.github.io/lua53doc diff --git a/contents.html b/contents.html index 0931e3c..10886f5 100644 --- a/contents.html +++ b/contents.html @@ -22,7 +22,7 @@
这份参考手册是对 Lua 语言的官方定义。 -关于 Lua 编程的方方面面,则放在 +关于 Lua 编程的全部细节,则放在 Programming in Lua 这本书中。 @@ -33,7 +33,7 @@
-Lua 5.3.0 欢迎你
+Lua 5.3 欢迎你
@@ -45,7 +45,7 @@
Lua 的 官方网站 -上有关于 Lua 的完整信息, -其中包括 +上提供了关于 Lua 的完整信息, +包括 综合概要 -以及最新版的 +和最新的 文档, 需要注意的是 参考手册 可能和 @@ -73,73 +73,69 @@
-Lua 是以 +Lua 以 源代码 -的形式发布的。 -在使用前,你需要自己构建它。 -构建 Lua 非常简单,因为 Lua 是用纯粹的 ANSI C 实现的,在所有有 ANSI C 编译器的平台都可以直接编译。 -同时,Lua 还可以直接以 C++ 形式编译。 +的形式发布,使用之前,你需要构建它。 +构建 Lua 非常简单,因为 Lua 是用纯粹的 ANSI C 实现的,在所有具备 ANSI C 编译器的平台都可以直接编译。 +同时,Lua 也可以直接以 C++ 形式编译。 下面介绍了类 Unix 平台上的构建流程,另有 其它系统构建介绍 与 配置选项 以作参考。
-如果你没有时间或兴趣自己编译 Lua , +如果你没有时间或兴趣自己编译 Lua, 可以从 -LuaBinaries 获取编译后的二进制文件, +LuaBinaries 获取编译后的二进制文件 或者从 LuaDist 这里获取 Lua 的多平台发布版(自带电池)。
-对于大多数类 Unix 平台,只需要输入 "make" 加上合适的平台名即可。细节如下: +在大多数类 Unix 平台上,输入 "make" 加上合适的平台名即可。步骤如下:
aix bsd c89 freebsd generic linux macosx mingw posix solaris
- 如果你的平台列在其中,那么只需要运行 "make xxx",这里的 xxx - 指你的平台名。 + 如果你的平台在其中,运行 "make xxx" 即可,xxx 代表你的平台名。
- 如果你的平台不在这个列表内,那么先试一下最接近的那个,然后再按 posix generic c89 这个次序依次尝试。 + 如果你的平台不在其中,先尝试最相近的平台,再按 posix generic c89 顺序依次尝试。
-如果你是 Linux 系统,出现了编译错误的话,请确认你有安装 -readline 开发包。 -如果还是有链接错误,可以试一下 +如果你是 Linux 系统并出现了编译错误,请确认你是否安装了 +readline (也可能叫 libreadline-dev 或者 readline-devel)开发包。 +之后,如果还有链接错误,尝试 "make linux MYLIBS=-ltermcap" 。
- 一旦你构建完毕,可能希望把 Lua 安装到系统默认位置。 - 那么,执行 "make install" 就可以了。 + 一旦你构建完毕,可能希望把 Lua 安装到系统默认位置, + 那么执行 "make install" 即可。 系统默认位置以及如何安装都定义在 Makefile 中。 这个过程可能需要有相关的权限。
- 运行 "make xxx install" 可以构建和安装一步到位, - 这里的 xxx 指你的平台名。 + 运行 "make xxx install" 可以构建和安装一步到位,xxx 指你的平台名。
如果你想把 Lua 安装在本地,运行 "make local"。 @@ -148,7 +144,7 @@
@@ -43,43 +43,41 @@
-Lua 是一门扩展式程序设计语言,它被设计成支持通用过程式编程,并有相关数据描述设施。 -同时也很好的支持了面向对象编程、函数式编程、数据驱动式编程。 +Lua 是一门扩展式程序设计语言,被设计成支持通用过程式编程,并有相关数据描述设施。 +同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 -它以库形式实现,用 clean C 写成。 -所谓 clean C ,指的是标准 C 和 C++ 间共通的一个子集。 +Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。
-作为一个扩展式语言,Lua 没有 "main" 程序的概念:
+作为一门扩展式语言,Lua 没有 "main" 程序的概念:
它只能 嵌入 一个宿主程序中工作,
-这个宿主程序被称作 被嵌入的程序 或简称为 宿主 。
-宿主程序可以调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注入 C 函数让 Lua 代码调用。
-依靠这些 C 函数,在各种不同的领域中,都可以将拥有相同句法结构的 Lua 定制为该领域下的编程语言。
-Lua 的官方发布版包含了一个叫做 lua 的简单的宿主程序,
-它用 Lua 库实现了一个完整的独立 Lua 解释器。
-你可以把它作交互式应用或用于批处理。
+该宿主程序被称为 被嵌入程序 或者简称 宿主 。
+宿主程序可以调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注册 C 函数让 Lua 代码调用。
+依靠 C 函数,Lua 可以共享相同的语法框架来定制编程语言,从而适用不同的领域。
+Lua 的官方发布版包含一个叫做 lua 的宿主程序示例,
+它是一个利用 Lua 库实现的完整独立的 Lua 解释器,可用于交互式应用或批处理。
-Lua 是一个自由软件,它的使用许可证决定了它的使用过程没有任何担保。
-这份手册中描述的实现,可以在 Lua 的官方网站 www.lua.org 找到。
+Lua 是一个自由软件,其使用许可证决定了它的使用过程无需任何担保。
+本手册所描述的实现可以在 Lua 的官方网站 www.lua.org 找到。
-跟其它的许多参考手册一样,这份文档有些地方比较枯燥。 -Lua 设计决定方面的讨论, +与其它的许多参考手册一样,这份文档有些地方比较枯燥。 +关于 Lua 背后的设计思想, 可以看看 Lua 网站上提供的技术论文。 -有关用 Lua 编程的细节介绍, -可以读一下 Roberto 的书,Programming in Lua。 +至于用 Lua 编程的细节介绍, +请参阅 Roberto 的书,Programming in Lua。
-这一章描述了语言的基本概念。 +本章描述了语言的基本概念。 @@ -89,98 +87,94 @@
Lua 中所有的值都是 一等公民。 -这意味着所有的值都可以保存在变量中、 -当作参数传递给其它函数、以及作为返回值出现。 +这意味着所有的值均可保存在变量中、 +当作参数传递给其它函数、以及作为返回值。
Lua 中有八种基本类型:
-nil, boolean, number,
-string, function, userdata,
-thread, and table.
+nil、boolean、number、string、function、userdata、
+thread 和 table。
Nil 是值 nil 的类型,
-它的主要特征就是和其它值区别开;
-它通常用来表示一个有意义的值不存在时的状态。
+其主要特征就是和其它值区别开;通常用来表示一个有意义的值不存在时的状态。
Boolean 是 false 与 true 两个值的类型。
nil 和 false 都会导致条件判断为假;
-所有其它的值都表现为真。
-Number 代表了整数或实数(浮点数)。
+而其它任何值都表示为真。
+Number 代表了整数和实数(浮点数)。
String 表示一个不可变的字节序列。
-Lua 是 8 位友好的:
-字符串可以包含任意 8 位值,
-其中包括零 ('\0') 。
-Lua 的字符串编码无关;
-它不理会字符串里的内容到底是什么。
+Lua 对 8 位是友好的:
+字符串可以容纳任意 8 位值,
+其中包含零 ('\0') 。
+Lua 的字符串与编码无关;
+它不关心字符串中具体内容。
-number 类型有两种内部呈现方式,
-一种称为 整数 另一种称为 浮点数。
-对于使用哪种内部形式,Lua 有明确的规则,
-但它也按需(参见 §3.4.3)自动转换。
-因此,程序员需要选择完全忽略其间的差异
-还是对如何在内部呈现数字做完全的控制。
-标准 Lua 使用 64 位整数以及双精度(64 位)浮点数,
-但你可以把 Lua 编译成使用 32 位整数及单精度(32 位)浮点数。
-以 32 位表示数字对小型机器以及嵌入式系统特别有意义。
+number 类型有两种内部表现方式,
+ 整数 和 浮点数。
+对于何时使用哪种内部形式,Lua 有明确的规则,
+但它也按需(参见 §3.4.3)作自动转换。
+因此,程序员多数情况下可以选择忽略整数与浮点数之间的差异或者假设完全控制每个数字的内部表现方式。
+标准 Lua 使用 64 位整数和双精度(64 位)浮点数,
+但你也可以把 Lua 编译成使用 32 位整数和单精度(32 位)浮点数。
+以 32 位表示数字对小型机器以及嵌入式系统特别合适。
(参见 luaconf.h 文件中的宏 LUA_32BITS 。)
Lua 可以调用(以及操作)用 Lua 或 C (参见 §3.4.10)编写的函数。 -这两种函数有统一的类型 function。 +这两种函数有统一类型 function。
userdata 类型允许将 C 中的数据保存在 Lua 变量中。 -用户数据类型的值是一个内存块。 +用户数据类型的值是一个内存块, 有两种用户数据: -完全用户数据 指一块由 Lua 管理的内存对应的对象; -轻量用户数据 则指一个简单的 C 指针。 -用户数据在 Lua 中没有预定义的操作,你只能对它进行赋值操作及判断两个用户数据是否相同。 -使用 元表 的话,程序员可以给完全用户数据定义一系列的操作 +完全用户数据 ,指一块由 Lua 管理的内存对应的对象; +轻量用户数据 ,则指一个简单的 C 指针。 +用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的操作。 +通过使用 元表 ,程序员可以给完全用户数据定义一系列的操作 (参见 §2.4)。 -在 Lua 代码中,你不能查和修改一个用户数据的值,这些工作只能通过 C API 完成。 +你只能通过 C API 而无法在 Lua 代码中创建或者修改用户数据的值, 这保证了数据仅被宿主程序所控制。
-thread 类型表示了一个独立的执行序列,它被用于实现协程 +thread 类型表示了一个独立的执行序列,被用于实现协程 (参见 §2.6)。 -Lua 线程并非操作系统线程。 -Lua 为所有的系统,包括那些不提供原生线程支持的系统,提供了协程支持。 +Lua 的线程与操作系统的线程毫无关系。 +Lua 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。
table 是一个关联数组,
-也就是说,这个数组不仅仅以数做索引,除了 nil 和 NaN 之外的 Lua 值
+也就是说,这个数组不仅仅以数字做索引,除了 nil 和 NaN 之外的所有 Lua 值
都可以做索引。
(Not a Number 是一个特殊的数字,它用于表示未定义或表示不了的运算结果,比如 0/0。)
表可以是 异构 的;
-也就是说,表内可以包含(除 nil 外的任何类型的值)。
+也就是说,表内可以包含任何类型的值( nil 除外)。
任何键的值若为 nil 就不会被记入表结构内部。
-换句话说,对于表内不存在的键,都对应着值 nil 。
+换言之,对于表内不存在的键,都对应着值 nil 。
-表是 Lua 中唯一的数据结构;
-它可被用于表示普通数组、序列、符号表、集合、记录、图、树、等等。
+表是 Lua 中唯一的数据结构,
+它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。
对于记录,Lua 使用域名作为索引。
语言提供了 a.name 这样的语法糖来替代
a["name"] 这种写法以方便记录这种结构的使用。
-有多种方式在 Lua 中创建表结构(参见 §3.4.9)。
+在 Lua 中有多种便利的方式创建表(参见 §3.4.9)。
-我们使用 序列 这个术语来表示一个用 {1..n} 的正整数集 -做索引的表。这里的非负整数 n 被称为这个序列的长度 -(参见 §3.4.7)。 +我们使用 序列 这个术语来表示一个用 {1..n} 的正整数集做索引的表。 +这里的非负整数 n 被称为该序列的长度(参见 §3.4.7)。
@@ -196,9 +190,9 @@
a[i] 与 a[j]
表示了表中相同的元素。
-特别指出:一个可以完全表达为整数的浮点数和对应的整数相等
+特别指出:一个可以完全表示为整数的浮点数和对应的整数相等
(例如:1.0 == 1)。
-为了消除歧义,当一个可以完全表达为整数的浮点数做为键值时,
+为了消除歧义,当一个可以完全表示为整数的浮点数做为键值时,
都会被转换为对应的整数储存。
例如,当你写 a[2.0] = true 时,
实际被插入表中的键是整数 2 。
@@ -209,7 +203,7 @@ 表、函数、线程、以及完全用户数据在 Lua 中被称为 对象: 变量并不真的 持有 它们的值,而仅保存了对这些对象的 引用。 -赋值、参数传递、函数返回,都是针对引用而不是针对值的操作; +赋值、参数传递、函数返回,都是针对引用而不是针对值的操作, 这些操作均不会做任何形式的隐式拷贝。 @@ -226,13 +220,13 @@
var 的自由名字(指在任何层级都未被声明的名字)
在句法上都被翻译为 _ENV.var 。
-此外,每个被编译的 Lua 代码块都会有一个额外的局部变量叫 _ENV
+此外,每个被编译的 Lua 代码块都会有一个外部的局部变量叫 _ENV
(参见 §3.3.2),
因此,_ENV 这个名字永远都不会成为一个代码块中的自由名字。
-在转译那些自由名字时,_ENV 是否是那个额外的局部变量无所谓。
+在转译那些自由名字时,_ENV 是否是那个外部的局部变量无所谓。
_ENV 和其它你可以使用的变量名没有区别。
这里特别指出,你可以定义一个新变量或指定一个参数叫这个名字。
当编译器在转译自由名字时所用到的 _ENV ,
@@ -266,47 +260,44 @@
-Lua 作为一门嵌入式语言,
-所有的 Lua 行为都始于宿主程序的 C 代码中对于 Lua 库里某函数的一次调用。
-(当你使用 Lua 独立版本时,lua 程序就是那个宿主程序。)
-在编译或运行一个 Lua 代码块时,无论发生任何错误,
-控制权都返还给宿主。接下来可以针对情况来采取恰当的措施
-(比如打印错误消息)。
+由于 Lua 是一门嵌入式扩展语言,其所有行为均源于宿主程序中 C 代码对某个 Lua 库函数的调用。
+(单独使用 Lua 时,lua 程序就是宿主程序。)
+所以,在编译或运行 Lua 代码块的过程中,无论何时发生错误,
+控制权都返回给宿主,由宿主负责采取恰当的措施(比如打印错误消息)。
-Lua 代码中可以通过调用 error 函数来显式的抛出一个错误。
+可以在 Lua 代码中调用 error 函数来显式地抛出一个错误。
如果你需要在 Lua 中捕获这些错误,
-你可以使用 pcall 或
+可以使用 pcall 或
xpcall
-以 保护模式 来调用一个函数。
+在 保护模式 下调用一个函数。
-无论何时错误发生,都会产生一个携带有错误信息的 错误对象 -(也被称为 错误消息)。 -Lua 本身只会产生字符串类型的错误对象, -但你的程序可以为一个错误抛出任何类型的错误对象。 -这就看 Lua 程序或你的宿主如何处理这些错误对象了。 +无论何时出现错误,都会抛出一个携带错误信息的 错误对象 +(错误消息)。 +Lua 本身只会为错误生成字符串类型的错误对象, +但你的程序可以为错误生成任何类型的错误对象, +这就看你的 Lua 程序或宿主程序如何处理这些错误对象。
-当你使用 xpcall 或
+使用 xpcall 或
lua_pcall 时,
-你应当给出一个 消息处理器 用于发生错误时的处理流程。
-这个处理器函数会被传入原始的错误消息,并应返回一个新的错误消息。
+你应该提供一个 消息处理函数 用于错误抛出时调用。
+该函数需接收原始的错误消息,并返回一个新的错误消息。
它在错误发生后栈尚未展开时调用,
-因此它可以通过栈来收集更多的信息。
-例如它可以通过探知栈来创建一组栈回溯信息。
-这个处理器函数也被保护模式调用以保护;
-因此在处理器函数内发生的错误会再次调用它。
-如果递归调用太深,Lua 会打破递归并返回一个恰当的消息。
+因此可以利用栈来收集更多的信息,
+比如通过探知栈来创建一组栈回溯信息。
+同时,该处理函数也处于保护模式下,所以该函数内发生的错误会再次触发它(递归)。
+如果递归太深,Lua 会终止调用并返回一个合适的消息。
-Lua 中的每个值都可以用一个 元表。 +Lua 中的每个值都可以有一个 元表。 这个 元表 就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 @@ -316,20 +307,26 @@
-元表中的键对应着不同的 事件 名;
+在元表中事件的键值是一个双下划线(__)加事件名的字符串;
键关联的那些值被称为 元方法。
-在上面那个例子中引用的事件为 "add" ,
-完成加操作的那个函数就是元方法。
+在上一个例子中,__add 就是键值,
+对应的元方法是执行加操作的函数。
你可以用 getmetatable 函数
来获取任何值的元表。
+Lua 使用直接访问的方式从元表中查询元方法(参见rawget)。
+所以,从对象 o 中获取事件 ev 的元方法等价于下面的代码:
+
+
+ rawget(getmetatable(o) or {}, "__ev")
+
-使用 setmetatable
-来替换一张表的元表。在 Lua 中,你不可以改变其它类型的值的元表
+你可以使用 setmetatable
+来替换一张表的元表。在 Lua 中,你不可以改变表以外其它类型的值的元表
(除非你使用调试库(参见§6.10));
若想改变这些非表类型的值的元表,请使用 C API。
@@ -352,19 +349,6 @@
-接下来会给出一张元表可以控制的事件的完整列表。
-每个操作都用对应的事件名来区分。
-每个事件的键名用加有 '__' 前缀的字符串来表示;
-例如 "add" 操作的键名为字符串 "__add"。
-注意、Lua 从元表中直接获取元方法;
-访问元表中的元方法永远不会触发另一次元方法。
-下面的代码模拟了 Lua 从一个对象 obj 中获取一个元方法的过程:
-
-
- rawget(getmetatable(obj) or {}, "__" .. event_name)
-
-
对于一元操作符(取负、求长度、位反), 元方法调用的时候,第二个参数是个哑元,其值等于第一个参数。 @@ -373,10 +357,16 @@
+接下来是元表可以控制的事件的详细列表。
+每个操作都用对应的事件名来区分。
+每个事件的键名用加有 '__' 前缀的字符串来表示;
+例如 "add" 操作的键名为字符串 "__add"。
+
__add:
+ 操作。
如果任何不是数字的值(包括不能转换为数字的字符串)做加法,
@@ -387,52 +377,52 @@ __sub:
- 操作。
行为和 "add" 操作类似。
__mul:
* 操作。
行为和 "add" 操作类似。
__div:
/ 操作。
行为和 "add" 操作类似。
__mod:
% 操作。
行为和 "add" 操作类似。
__pow:
^ (次方)操作。
行为和 "add" 操作类似。
__unm:
- (取负)操作。
行为和 "add" 操作类似。
__idiv:
// (向下取整除法)操作。
行为和 "add" 操作类似。
__band:
& (按位与)操作。
行为和 "add" 操作类似,
@@ -440,37 +430,37 @@ __bor:
| (按位或)操作。
行为和 "band" 操作类似。
__bxor:
~ (按位异或)操作。
行为和 "band" 操作类似。
__bnot:
~ (按位非)操作。
行为和 "band" 操作类似。
__shl:
<< (左移)操作。
行为和 "band" 操作类似。
__shr:
>> (右移)操作。
行为和 "band" 操作类似。
__concat:
.. (连接)操作。
行为和 "add" 操作类似,
@@ -478,7 +468,7 @@ __len:
# (取长度)操作。
如果对象不是字符串,Lua 会尝试它的元方法。
@@ -489,7 +479,7 @@ __eq:
== (等于)操作。
和 "add" 操作行为类似,
@@ -498,7 +488,7 @@ __lt:
< (小于)操作。
和 "add" 操作行为类似,
@@ -506,7 +496,7 @@ __le:
<= (小于等于)操作。
和其它操作不同,
@@ -517,7 +507,7 @@ __index:
索引 table[key]。
当 table 不是表或是表 table 中不存在
@@ -533,7 +523,7 @@ __newindex:
索引赋值 table[key] = value 。
和索引事件类似,它发生在
@@ -559,7 +549,7 @@ __call:
函数调用操作 func(args)。
当 Lua 尝试调用一个非函数的值的时候会触发这个事件
@@ -686,7 +676,7 @@ lua_close),
Lua 将调用所有被标记了需要触发终结器对象的终结过程,
其次序为标记次序的逆序。
-在这个过程中,任何终结器再次标记对象的行为都会不会生效。
+在这个过程中,任何终结器再次标记对象的行为都不会生效。
@@ -703,7 +693,7 @@ 一张弱表可以有弱键或是弱值,也可以键值都是弱引用。 -仅含有弱键的表允许收集器回收它的键,但会阻止对值所指的对象被回收。 +含有弱值的表允许收集器回收它的值,但会阻止收集器回收它的键。 若一张表的键值均为弱引用, 那么收集器可以回收其中的任意键和值。 任何情况下,只要键或值的任意一项被回收, @@ -758,34 +748,35 @@
-Lua 支持协程,同时它也被称为 协同式多线程。 -Lua 为每个协程提供一个独立的运行序。 -然而和多线程系统中的线程不同, -协程仅在显式地调用一个让出函数时才挂起当前的执行状态。 +Lua 支持协程,也叫 协同式多线程。 +一个协程在 Lua 中代表了一段独立的执行线程。 +然而,与多线程系统中的线程的区别在于, +协程仅在显式调用一个让出(yield)函数时才挂起当前的执行。
-通过调用
+调用函数
coroutine.create
可创建一个协程。
-它唯一的参数是一个函数,这个函数将作为这个协程的主函数。
-create 函数仅仅创建出这个协程然后返回它的句柄
-(一个类型为 thread 的对象);
-它并不运行该协程。
+其唯一的参数是该协程的主函数。
+create 函数只负责新建一个协程并返回其句柄
+(一个 thread 类型的对象);
+而不会启动该协程。
-通过调用
+调用
coroutine.resume
-可执行一个协程。
+函数执行一个协程。
第一次调用
coroutine.resume
时,第一个参数应传入
coroutine.create
-返回的线程对象,这样协程就会从其主函数的第一行开始执行。
+返回的线程对象,然后协程从其主函数的第一行开始执行。
+传递给
coroutine.resume
-后面的参数将作为主函数的参数传入。
-协程将一直运行到它结束或 让出。
+的其他参数将作为协程主函数的参数传入。
+协程启动之后,将一直运行到它终止或 让出。
@@ -802,40 +793,38 @@
-让出协程的执行通过调用
-coroutine.yield 完成。
-当协程让出,
-即使让出发生在内嵌函数调用中
-(即不在主函数,但在主函数直接或间接调用的函数内部),
-之前对该协程调用的 coroutine.resume 会立刻返回。
-在让出的情况下,
-coroutine.resume 依旧返回 true,
-接下来的返回值是传给
-coroutine.yield 的那些参数。
-当下一次你延续同一个协程时,
-协程会接在让出点继续运行。
-调用 coroutine.yield
-的让出点会返回传给
+通过调用
+coroutine.yield 使协程暂停执行,让出执行权。
+协程让出时,对应的最近 coroutine.resume
+函数会立刻返回,即使该让出操作发生在内嵌函数调用中
+(即不在主函数,但在主函数直接或间接调用的函数内部)。
+在协程让出的情况下,
+coroutine.resume 也会返回 true,
+并加上传给
+coroutine.yield 的参数。
+当下次重启同一个协程时,
+协程会接着从让出点继续执行。
+此时,此前让出点处对 coroutine.yield 的调用
+会返回,返回值为传给
coroutine.resume
-的额外参数。
+的第一个参数之外的其他参数。
-就像
-coroutine.create 那样,
+与
+coroutine.create 类似,
coroutine.wrap 函数也会创建一个协程。
-不同的是,它不返回协程本身,而是返回一个函数。
-调用这个函数将延续这个协程。
-为这个函数提供的参数相当于
-传给 coroutine.resume 的额外参数。
+不同之处在于,它不返回协程本身,而是返回一个函数。
+调用这个函数将启动该协程。
+传递给该函数的任何参数均当作 coroutine.resume 的额外参数。
coroutine.wrap
-的返回值是
+返回
coroutine.resume
-的返回值中除去第一个返回值(布尔型的错误码)剩余的部分。
+的所有返回值,除了第一个返回值(布尔型的错误码)。
和 coroutine.resume 不同,
coroutine.wrap
不会捕获错误;
-错误会传播给调用者。
+而是将任何错误都传播给调用者。
@@ -1758,7 +1747,7 @@
-从数字转换为字符串使用非制定的人可读的格式。
+从数字转换为字符串使用非指定的人可读的格式。
若想完全控制数字到字符串的转换过程,
可以使用字符串库中的 format 函数
(参见 string.format)。
@@ -2242,7 +2231,7 @@
因为有这样一个词法作用范围的规则, -局部变量可以被在它的作为范围内定义的函数自由使用。 +局部变量可以被在它的作用范围内定义的函数自由使用。 当一个局部变量被内层的函数中使用的时候, 它被内层函数称作 上值,或是 外部局部变量。 @@ -2311,7 +2300,7 @@
-对于那些以可接受索引调用的函数,
+对于那可以接受索引调用的函数,
无效索引被看作包含了一个虚拟类型
LUA_TNONE 的值,
这个值的行为和 nil 一致。
@@ -2496,7 +2485,7 @@
abort 来退出宿主程序。
你的 panic 函数只要不返回
(例如:长跳转到你在 Lua 外你自己设置的恢复点)
-就可以必须退出程序。
+就可以不退出程序。
@@ -2591,7 +2580,7 @@
lua_pcall
-执行得 Lua 代码发生过中断(错误或让出)后,
+执行的 Lua 代码发生过中断(错误或让出)后,
还得继续调用 k 。
所以我们还得继续改写这段代码,把
lua_pcall 替换成
@@ -2609,7 +2598,7 @@ lua_pcallk
(以及 lua_callk)也会正常返回。
-(当然,这个例子中你也可以不再之后调用延续函数,
+(当然,这个例子中你也可以不在之后调用延续函数,
而是在原函数的调用后直接写上需要做的工作。)
@@ -3595,7 +3584,7 @@ void *lua_newuserdata (lua_State *L, size_t size);
-这个函数分配分配一块指定大小的内存块, +这个函数分配一块指定大小的内存块, 把内存块地址作为一个完全用户数据压栈, 并返回这个地址。 @@ -3652,7 +3641,7 @@
-Lua 中数字的类型。确省是 double ,但是你改成 float 。
+Lua 中数字的类型。缺省是 double ,但是你可以改成 float 。
(参见 luaconf.h 中的 LUA_REAL 。)
@@ -3859,7 +3848,7 @@
%%' (插入一个字符 '%'),
'%s' (插入一个带零终止符的字符串,没有长度限制),
'%f' (插入一个 lua_Number),
-'%L' (插入一个 lua_Integer),
+'%I' (插入一个 lua_Integer),
'%p' (插入一个指针或是一个十六进制数),
'%d' (插入一个 int),
'%c' (插入一个用 int 表示的单字节字符),以及
@@ -3914,7 +3903,7 @@ const char *lua_pushliteral (lua_State *L, const char *s);
-这个宏等价于 lua_pushlstring,
+这个宏等价于 lua_pushstring,
区别仅在于只能在 s 是一个字面量时才能用它。
它会自动给出字符串的长度。
@@ -3965,7 +3954,7 @@
const char *lua_pushstring (lua_State *L, const char *s);
-将指针 s 指向的零结尾的字符串压栈。
+将指针 s 指向的零结尾的字符串压栈。Lua 对这个字符串做一个内部副本(或是复用一个副本),
因此 s 处的内存在函数返回后,可以释放掉或是立刻重用于其它用途。
@@ -4214,7 +4203,7 @@
@@ -4478,7 +4467,7 @@
len 不为 NULL ,
它还把字符串长度设到 *len 中。
这个 Lua 值必须是一个字符串或是一个数字;
-否则返回返回 NULL 。
+否则返回 NULL 。
如果值是一个数字, lua_tolstring
还会 把堆栈中的那个值的实际类型转换为一个字符串。
(当遍历一张表的时候,
@@ -4859,7 +4848,7 @@ nparams:
-函数固定行参个数
+函数固定形参个数
(对于 C 函数永远是 0 )。
如果 glb 为真,
-同时也讲模块设到全局变量 modname 里。
+同时也将模块设到全局变量 modname 里。
@@ -6334,9 +6323,9 @@
除了基础库和包管理库, @@ -6891,7 +6880,7 @@
co 的状态:
当协程正在运行(它就是调用 status 的那个) ,返回 "running";
如果协程调用 yield 挂起或是还没有开始运行,返回 "suspended";
-如果协程是活动的,都并不在运行(即它正在延续其它协程),返回 "normal";
+如果协程是活动的,但并不在运行(即它正在延续其它协程),返回 "normal";
如果协程运行完主体函数或因错误停止,返回 "dead"。
@@ -6930,7 +6919,7 @@
-包管理库提供了从 Lua 中加载模块的基础设施。
+包管理库提供了从 Lua 中加载模块的基础库。
只有一个导出函数直接放在全局环境中:
require。
所有其它的部分都导出在表 package 中。
@@ -6951,7 +6940,7 @@
require 遵循 package.searchers 序列的指引来查找加载器。
-如果改变这个序列,我们可以改变 require 如果查找一个模块。
+如果改变这个序列,我们可以改变 require 如何查找一个模块。
下列说明基于 package.searchers
的默认配置。
@@ -7901,7 +7890,7 @@
utf8.codepoint (s [, i [, j]])s 中
+以整数形式返回 s 中
从位置 i 到 j 间(包括两端)
所有字符的编号。
默认的 i 为 1 ,默认的 j 为 i。
@@ -8277,7 +8266,7 @@ m 与 n 调用时,
math.random 返回一个 [m, n] 区间
内一致分布的整数伪随机数。
-(值 m-n 不能是负数,且必须在 Lua 整数的表示范围内。)
+(值 n-m 不能是负数,且必须在 Lua 整数的表示范围内。)
调用 math.random(n) 等价于 math.random(1,n)。
@@ -8361,7 +8350,7 @@ I/O 库提供了两套不同风格的文件处理接口。 @@ -8525,7 +8514,7 @@
-返回一个临时文件的句柄。 +如果成功,返回一个临时文件的句柄。 这个文件以更新模式打开,在程序结束时会自动删除。 @@ -8629,10 +8618,6 @@
i":
-读取一个整数,返回整数值。
-a":
从当前位置开始读取整个文件。
如果已在文件末尾,返回空串。
@@ -8670,11 +8655,11 @@ offset 和
whence 字符串 whence
-制定的基点决定。基点可以是:
+指定的基点决定。基点可以是:
set": 基点为 0 (文件开头);cur": 基点为当前位置了;cur": 基点为当前位置;end": 基点为文件尾;
当 seek 成功时,返回最终从文件开头计算起的文件的位置。
@@ -8712,7 +8697,7 @@
line":
行缓冲;
-输出将到每次换行前,
+输出将缓冲到每次换行前,
对于某些特殊文件(例如终端设备)缓冲到任何输入前。
这个库都通过表 os 实现。
@@ -8828,7 +8813,7 @@
system。
它调用系统解释器执行 command。
如果命令成功运行完毕,第一个返回值就是 true,
-否则是 nil otherwise。
+否则是 nil。
在第一个返回值之后,函数返回一个字符串加一个数字。如下:
-将 value (可以是 nil) 设为 table 的元表。
+将 value 的元表设为 table (可以是 nil)。
返回 value。
@@ -9520,7 +9505,7 @@
atan2, cosh, sinh, tanh, pow,
frexp, 以及 ldexp 。
-你可以用 x^y 替换 math.pow(x,y);
+你可以用 x^y 替换 math.pow(x,y);
你可以用 math.atan 替换 math.atan2,前者现在可以接收一或两个参数;
你可以用 x * 2.0^exp 替换 math.ldexp(x,exp)。
若用到其它操作,你可以写一个扩展库,或在 Lua 中实现它们。