VersionNotice:此頁面關係到 Lua 的開發版本(5.0 alpha 和 beta)。
不相容性
我們即將要釋出 Lua 5.0 beta。以下是從 5.0 alpha 到 5.0 beta 的不 tương容性列表。(大多數都與 coroutines 有關;這是 Lua 仍然很新的領域。)
- 對應於弱表格的 API 已回復到最初的狀態:沒有更多的 setmode/getmode;它在元表格中使用 "__mode" 欄位。
- 正如我們預期的,不再有 __gettable/__settable metaindices。它們已與 __index/__newindex 整合。
- 執行緒是 Lua 中的新類型。(這是為了解決垃圾回收 coroutines 的問題而必須的。)呼叫
LUA_API lua_State *lua_newthread (lua_State *L);
會將新的執行緒保留在堆疊上。除了主執行緒之外的所有執行緒都是可以被垃圾回收的。對 coroutine 來說,這正是我們需要的。其他的多執行緒系統(例如 LuaThreads??)可能會儲存在登錄檔中,例如避免它們的集合中。
- 對應於 coroutine 的 API 也改變了。"coroutine.create" 現在會傳回一個 coroutine("執行緒" 類型的物件),而不是一個函式。有一個明確的 "coroutine.resume" 來重新開始 coroutine 的執行。我們認為這個 API 對多數人來說較易於理解。舊有的功能性仍舊可以透過 "coroutine.wrap" 取得,它會建立一個 coroutine 並將其 "包裝" 在一個函式(閉包)內部,每次呼叫它時都會重新開始 coroutine 的執行。
- "coroutine.resume" 可以將參數傳給 yield。"coroutine.create"(和 "coroutine.wrap")現在只帶一個引數,coroutine 本體。第一次呼叫 resume 時,傳給 "resume" 的額外引數(或使用 "wrap" 時傳給閉包的引數)會成為本體的參數。下次再次呼叫 resume 時,額外的引數會作為 "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
- coroutine.resume 使用 "受保護模式",像是 pcall 的工作方式。它第一個傳回值是 true 或 false(有無錯誤)。如果為 true,其他的結果會是 yield 的引數或是本體的回傳值。如果為 false,其他的引數是錯誤訊息。("wrap" 回傳的函式不會在受保護模式下工作。)
- 宏 LUA_USERSTATE 現在會在 lua_State 所指向的區域 *前面* 開啟一個額外的空間。
-- Roberto
新功能
以下是 5.0 beta(相較於 5.0 alpha)中的一些新功能。它們應該不會在 "一般" 程式中造成不 tương容性。
- 編譯器不會改變 "交換式" 運算子的運算元順序。(我已經不記得為什麼,但我記得在清單上針對這件事有很多討論。)(但是 "a>b" 仍然會被轉譯為 "b<a",而 "a>=b" 會被轉譯為 "b<=a"。)
- 從 Lua 內部預先編譯 Lua 程式碼的新功能(function stringdump)。
- lua.c 中的「-l」選項會進行「require」(因此會搜尋 LUA_PATH),而不是單純的 dofile。
- 針對物件標頭、巨集和文件進行重新整理,以邁向增量垃圾蒐集器。我們計畫在 5.1 中加入增量蒐集器(儘快發佈,但需在 5.0 之後 ;-)。
RecentChanges · 喜好設定
編輯 · 記錄
最後編輯時間:2009 年 3 月 16 日 上午 10:23 GMT (差異)