Lua 參考手冊附註 |
|
在 LuaTutorial 中有一些類似的頁面,但此頁並非教學手冊,而那些類似頁面中的一些內容不一定會以教學格式呈現,並且可能更適合置於此處。此頁的性質和目的與之 MySQL 參考中的使用者附註 [3] 類似。
實際上,數值 for 陳述式中值的清單並不是清單,且最後一個值會被截斷。因此,您不能說 for i = f(x) do ... end,其中 f(x) 會傳回 2、4、1。這與非數值 for 不同,它不會被截斷。(由 RiciLake 註明)
未在此處列出一些後置方法。其中包括 __gc
、__mode
和 __metatable
。
請注意,__tostring
僅會由 tostring
呼叫,而不是在自動轉換為字串期間呼叫。__gc
僅會在完整使用者資料上呼叫(這是 Lua 中已實現之物件上 RAII 無法運作的原因之一)。(在 Beginning Lua Programming,第 268 頁上有一個有用的圖表,顯示特定後置方法的適用時機。)
「索引」指的是堆疊上的索引,而不是堆疊層級(例如 getfenv
)。至少兩位使用者表示參考手冊中的這一點不夠明確。您可以使用 lua_getinfo
和 "f"
,在指定堆疊層級上取得函式。
含意為...發生錯誤時,將錯誤推入堆疊並傳回錯誤代碼(LUA_ERRSYNTAX 或 LUA_ERRMEM)。成功時,傳回 0 並將函式傳回值推入堆疊。
如果您不希望傳回值累積在堆疊上,請使用下列方式
(luaL_loadstring(L, str) || lua_pcall(L, 0, 0, 0))
含意為...發生錯誤時,將錯誤推入堆疊並傳回錯誤代碼(LUA_ERRSYNTAX、LUA_ERRMEM 或 LUA_ERRFILE)。成功時,傳回 0 並將函式傳回值推入堆疊。
如果您不希望傳回值累積在堆疊上,請使用下列方式
(luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0))
此函式在插入表格時會呼叫後置方法,但這一點並未記錄在文件中。
在「目前,Lua 具有下列標準函式庫」之後,它應該列出「coroutine 操作」。
請參閱 GeneralizedPairsAndIpairs,以取得呼叫後置方法的重新實作。
請參閱 GeneralizedPairsAndIpairs,以取得呼叫後置方法的重新實作。
請參閱 GeneralizedPairsAndIpairs,以取得呼叫後置方法的重新實作。
雖然沒有明確指定,但傳遞給 選擇
的負數索引表示相對於 ...
的尾端之位移。範圍外索引會引發錯誤。從 luaB_select
中可看出,這明顯是預期的行為。下方的測試套件展示了這一點
function test(...) return select(-1, ...) end function test2(...) return select(-2, ...) end assert(not pcall(function() assert(test() == nil) end)) assert(test(1) == 1) assert(test(1,2) == 2) assert(test(1,2,3) == 3) local a,b,c = test2(1,2) assert(a == 1 and b == 2 and c == nil) local a,b,c = test2(1,2,3) assert(a == 2 and b == 3 and c == nil)
為什麼 異呼叫
不像 平行呼叫
那樣接受函數參數?以下程式碼係由 RiciLake 所建議。
/** better_xpcall(errfunc, func, ...) */ static int l_better_xpcall (lua_State *L) { luaL_checktype(L, 1, LUA_TFUNCTION); luaL_checkany(L, 2); lua_pushboolean(L, 0 == lua_pcall(L, lua_gettop(L)-2, LUA_MULTRET, 1)); lua_replace(L, 1); return lua_gettop(L); }
請注意,errfunc 和 func 參數與標準異呼叫相比是調換過的。Sergey Rozhenko 撰寫的以下程式碼與標準異呼叫相容。
static int luaMy_xpcall (lua_State *L) { luaL_checktype(L, 2, LUA_TFUNCTION); // switch function & error function lua_pushvalue(L, 1); lua_pushvalue(L, 2); lua_replace(L, 1); lua_replace(L, 2); // call lua_pushboolean(L, 0 == lua_pcall(L, lua_gettop(L) - 2, LUA_MULTRET, 1)); lua_replace(L, 1); return lua_gettop(L); }
請參閱《Beginning Lua Programming》中的「第 9 章:使用協程自然地處理事件」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 9 章:協程」[4],或 CoroutinesTutorial。
請參閱《Beginning Lua Programming》中的「第 7 章:使用模組」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 15 章:模組和套件」[4],或 ModulesTutorial。
gmatch
和 gsub
中的 g
顯然代表「全域」,表示處理所有比對結果,而不僅僅是第一個(《Beginning Lua Programming》,第 186 頁)。它可能受到 Perl 的 /g
「全域比對」修飾符的啟發[5]。
gsub
這個名稱取自 AWK,早在 Lua 2.5 時代就有了。--lhf
請參閱《Beginning Lua Programming》中的「第 5 章:使用字串」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 20 章:字串函式庫」[4],或 LuaTypesTutorial + StringsTutorial + StringLibraryTutorial。
《Beginning Lua Programming》(第 302 頁)指出,string.dump
有個未記錄(可能會變更)的行為:「可以轉儲具有上層值的函數,但在轉儲的版本中,所有上層值都會變成函數的私人值(即使原先與其他函數共用),而且在函數內被指定值之前,它們都會是 nil
。(在 Lua 5.0 中,如果給定具有上層值的函數,string.dump
會引發錯誤。)」
請參閱《Beginning Lua Programming》中的「第 4 章:使用表格」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 19 章:表格函式庫」[4],或 TableLibraryTutorial。
請參閱《Beginning Lua Programming》中的「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 18 章:數學函式庫」[4],或 MathLibraryTutorial。
另見 Beginning Lua Programming 中的「第 5 章:使用字串」和「第 11 章:探索 Lua 的函式庫」或 Programming in Lua, Second Edition 中的「第 21 章:I/O 函式庫」[4]。
另見對應的 C 函式 fclose
[8]。
另見對應的 C 函式 fflush
[9]。
.
另見對應的 C 函式 fseek
[10]。
另見對應的 C 函式 setvfbuf
[11]。
.
另見對應的 C 函式 fopen
[12]。有助於模式。
更精確來說,文字會說「等同於 io.input():read(...)」(而非「io.input():read」,另見 io.write)。
更精確來說,文字會說「等同於 io.input():write(...)」(而非「io.input():write」,另見 io.read)。
另見 Beginning Lua Programming 中的「第 11 章:探索 Lua 的函式庫」、Programming in Lua, Second Edition 中的「第 22 章:作業系統函式庫」[4],以及 OsLibraryTutorial。
另見對應的 C 函式 clock
[13]。
另見對應的 C 函式 date
[14]。
可攜式 os.date("%z")
取代項,請見 TimeZone。
另見對應的 C 函式 difftime
[15]。
另見對應的 C 函式 system
[16]。
在 Windows 中,可透過在指令前面加上「start 」來執行非封鎖程序,而透過 os.execute
來執行。在 UNIX 類作業系統中,可在指令後面加上「&」。當然,這兩種方法皆不可移植。範例:
os.execute("start notepad") -- Windows os.execute("emacs &") -- UNIX
另見對應的 C 函式 exit
[17]。
另見對應的 C 函式 getenv
[18]。
Lua 標準函式庫不提供存取 POSIX 定義的 C 函式 setenv
,因為它並未定義在 ASCI C 中。
另見對應的 C 函式 remove
[19]。
另見對應的 C 函式 rename
[20]。
另請參閱對應 C setlocale
函數 [21] 和維基百科:Locale [22]。
各項功能及運算會受目前 locale 影響。包括:os.date
、string.lower
、string.upper
、字串比較,以及模式配對。
另請參閱對應 C time
函數 [23]。
另請參閱對應 C tmpnam
函數 [24]。
另請參閱 Beginning Lua Programming 的「第 11 章:探索 Lua 函式庫」或 Programming in Lua, Second Edition 的「第 23 章:除錯函式庫」[4]。
注意:getfenv
函數與 debug.getfenv
不盡相同。
相關注意事項:LuaList:2007-01/msg00214.html。
此函數類似 getmetatable
,但會在取得元資料時忽略 __metatable
元函數。此函數也可以稱為 rawgetmetatable
。由於有些物件可能會將 __metatable
元函數設為安全(防止客戶端取得元資料),您可能需要禁止使用 debug.getmetatable
。
此函數類似 setmetatable
,但可以使用於表格以外的物件。您甚至可以使用在 nil
中。
未記載注意事項:此函數會在成功時傳回 true
,在失敗時傳回 false
,不過目前看來似乎永遠會傳回 true。(請小心:未記載的行為可能在未來修改。)
另請參閱 MigratingToFiveOne、LuaFiveFeatures,以及 LuaFiveAlphaToBeta。
另請參閱 LuaGrammar。
我覺得「3. 應用程式介面」章節應該放在比較後面,這樣僅透過 Lua 語言使用 Lua 而非 C 語言(大部分使用者都屬於此類)的人們就不必費心研究它。這是比較進階的主題。--DavidManura
5.1 手冊的備用瀏覽器:我不喜歡 Lua 手冊全部都在同一頁面,所以為自己製作了一個小型瀏覽器/搜尋器,我時常使用它,並想與他人分享:[Luai] --McFin
以上頁面已針對 5.1.3 參考手冊進行檢查。--DavidManura