版本说明: 此页面涉及 Lua 的开发版本(5.0 alpha 和 beta)。
不兼容性
我们很快将发布 Lua 5.0 beta。以下是 5.0 alpha 到 5.0 beta 的不兼容性列表。(其中大多数与协程相关;这是 Lua 中仍然处于开发阶段的领域。)
- 弱表的 API 回到最初:不再有 setmode/getmode;它使用元表中的 "__mode" 字段。
- 正如我们预期的那样,不再有 __gettable/__settable 元索引。它们已与 __index/__newindex 统一。
- 线程是 Lua 中的一种新类型。(这是解决协程垃圾回收问题的必要步骤。)调用
LUA_API lua_State *lua_newthread (lua_State *L);
将新线程留在堆栈上。除主线程外,所有线程都是可垃圾回收的。对于协程来说,这正是我们需要的。其他多线程系统(如 LuaThreads??)可能会将线程存储在注册表中,例如,以避免它们被回收。
- 协程的 API 也发生了变化。"coroutine.create" 现在返回一个协程(一个类型为 "thread" 的对象),而不是一个函数。有一个显式的 "coroutine.resume" 来恢复协程。我们认为这个 API 对大多数人来说更容易理解。旧的功能仍然可用,名为 "coroutine.wrap",它创建一个协程并将其 "包装" 在一个函数(闭包)中,每次调用该函数时都会恢复协程。
- "coroutine.resume" 可以将参数传递给 yield。"coroutine.create"(和 "coroutine.wrap")现在只接受一个参数,即协程体。第一次恢复它时,"resume" 的额外参数(或使用 "wrap" 时闭包的参数)作为参数传递给主体。下次再次恢复时,额外参数作为 "yield" 的结果传递。例如
x = coroutine.create(function (a,b,c) print(a,b,c) print(coroutine.yield()) print(coroutine.yield()) end)
coroutine.resume(x, 1, 2, 3) --> 1, 2, 3 coroutine.resume(x, 10) --> 10 coroutine.resume(x, 4, 5) --> 4, 5 print(coroutine.resume(x)) --> false 无法恢复已死的协程
- coroutine.resume 在“保护模式”下工作,类似于 pcall。它的第一个返回值是 true 或 false(表示是否有错误)。如果为 true,则其他结果是 yield 的参数,或函数体的返回值。如果为 false,则另一个参数是错误消息。(由“wrap”返回的函数不在保护模式下工作。)
- 宏 LUA_USERSTATE 现在在 lua_State 指向的区域 *之前* 开辟了一个额外的空间。
-- Roberto
新功能
以下是 5.0 beta 版(与 5.0 alpha 版相比)的新功能。它们应该不会在“正常”程序中造成任何不兼容性。
- 编译器不会更改“可交换”运算符的操作数顺序。(我不记得为什么,但我记得在邮件列表中对此有过相当多的讨论。)(但是,“a>b”仍然被翻译成“b<a”,而“a>=b”被翻译成“b<=a”。)
- 新的功能,用于从 Lua 内部预编译 Lua 代码(函数 stringdump)。
- lua.c 中的选项“-l”执行“require”(因此会搜索 LUA_PATH),而不是简单的 dofile。
- 对象头以及宏/文档的重组,以实现增量式垃圾收集器。我们计划在 5.1 中实现增量式收集器(尽快发布,但在 5.0 发布之后 ;-)。
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 3 月 16 日上午 10:23 GMT (差异)