Lua 參考手冊附註

lua-users home
wiki

此頁包含針對 [1] Lua 參考手冊內容的附註與註解(版本 5.1,除非另有說明)。內容包含附註、使用範例和連結,用以釐清手冊內容,包括 API 中特定函式的更進階或細微注意事項。此頁的內容順序通常會遵循手冊內容的順序。另請參閱官方 Lua 5.1. 參考手冊勘誤清單 [2]

LuaTutorial 中有一些類似的頁面,但此頁並非教學手冊,而那些類似頁面中的一些內容不一定會以教學格式呈現,並且可能更適合置於此處。此頁的性質和目的與之 MySQL 參考中的使用者附註 [3] 類似。

2 - 語言

2.4.5 - For 陳述式

實際上,數值 for 陳述式中值的清單並不是清單,且最後一個值會被截斷。因此,您不能說 for i = f(x) do ... end,其中 f(x) 會傳回 2、4、1。這與非數值 for 不同,它不會被截斷。(由 RiciLake 註明)

2.8 - 元資料表

未在此處列出一些後置方法。其中包括 __gc__mode__metatable

請注意,__tostring 僅會由 tostring 呼叫,而不是在自動轉換為字串期間呼叫。__gc 僅會在完整使用者資料上呼叫(這是 Lua 中已實現之物件上 RAII 無法運作的原因之一)。(在 Beginning Lua Programming,第 268 頁上有一個有用的圖表,顯示特定後置方法的適用時機。)

3 - 應用程式介面

lua_getfenv

「索引」指的是堆疊上的索引,而不是堆疊層級(例如 getfenv)。至少兩位使用者表示參考手冊中的這一點不夠明確。您可以使用 lua_getinfo"f",在指定堆疊層級上取得函式。

luaL_dostring

含意為...發生錯誤時,將錯誤推入堆疊並傳回錯誤代碼(LUA_ERRSYNTAX 或 LUA_ERRMEM)。成功時,傳回 0 並將函式傳回值推入堆疊。

如果您不希望傳回值累積在堆疊上,請使用下列方式

(luaL_loadstring(L, str) || lua_pcall(L, 0, 0, 0))

luaL_loadfile

含意為...發生錯誤時,將錯誤推入堆疊並傳回錯誤代碼(LUA_ERRSYNTAX、LUA_ERRMEM 或 LUA_ERRFILE)。成功時,傳回 0 並將函式傳回值推入堆疊。

如果您不希望傳回值累積在堆疊上,請使用下列方式

(luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0))

luaL_register

此函式在插入表格時會呼叫後置方法,但這一點並未記錄在文件中。

5 - 標準函式庫

在「目前,Lua 具有下列標準函式庫」之後,它應該列出「coroutine 操作」。

5.1 - 基本函式

ipairs

請參閱 GeneralizedPairsAndIpairs,以取得呼叫後置方法的重新實作。

next

請參閱 GeneralizedPairsAndIpairs,以取得呼叫後置方法的重新實作。

pairs

請參閱 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);
}

5.2 - 協程操作

請參閱《Beginning Lua Programming》中的「第 9 章:使用協程自然地處理事件」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 9 章:協程」[4],或 CoroutinesTutorial

5.3 - 模組

請參閱《Beginning Lua Programming》中的「第 7 章:使用模組」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 15 章:模組和套件」[4],或 ModulesTutorial

5.4 - 字串操作

gmatchgsub 中的 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

string.dump

《Beginning Lua Programming》(第 302 頁)指出,string.dump 有個未記錄(可能會變更)的行為:「可以轉儲具有上層值的函數,但在轉儲的版本中,所有上層值都會變成函數的私人值(即使原先與其他函數共用),而且在函數內被指定值之前,它們都會是 nil。(在 Lua 5.0 中,如果給定具有上層值的函數,string.dump 會引發錯誤。)」

5.5 - 表格操作

請參閱《Beginning Lua Programming》中的「第 4 章:使用表格」和「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 19 章:表格函式庫」[4],或 TableLibraryTutorial

5.6 - 數學函數

請參閱《Beginning Lua Programming》中的「第 11 章:探索 Lua 函式庫」、「Programming in Lua, Second Edition」中的「第 18 章:數學函式庫」[4],或 MathLibraryTutorial

math.atan2

[6] [7]

5.7 - 輸入和輸出設備

另見 Beginning Lua Programming 中的「第 5 章:使用字串」和「第 11 章:探索 Lua 的函式庫」或 Programming in Lua, Second Edition 中的「第 21 章:I/O 函式庫」[4]

file:close

另見對應的 C 函式 fclose [8]

file:flush

另見對應的 C 函式 fflush [9]

file:read

.

file:seek

另見對應的 C 函式 fseek [10]

file:setvbuf

另見對應的 C 函式 setvfbuf [11]

file:write

.

io.open

另見對應的 C 函式 fopen [12]。有助於模式。

io.read

更精確來說,文字會說「等同於 io.input():read(...)」(而非「io.input():read」,另見 io.write)。

io.write

更精確來說,文字會說「等同於 io.input():write(...)」(而非「io.input():write」,另見 io.read)。

5.8 - 作業系統服務程式

另見 Beginning Lua Programming 中的「第 11 章:探索 Lua 的函式庫」、Programming in Lua, Second Edition 中的「第 22 章:作業系統函式庫」[4],以及 OsLibraryTutorial

os.clock

另見對應的 C 函式 clock [13]

os.date

另見對應的 C 函式 date [14]

可攜式 os.date("%z") 取代項,請見 TimeZone

os.difftime

另見對應的 C 函式 difftime [15]

os.execute

另見對應的 C 函式 system [16]

在 Windows 中,可透過在指令前面加上「start 」來執行非封鎖程序,而透過 os.execute 來執行。在 UNIX 類作業系統中,可在指令後面加上「&」。當然,這兩種方法皆不可移植。範例:

os.execute("start notepad")  -- Windows
os.execute("emacs &")  -- UNIX

os.exit

另見對應的 C 函式 exit [17]

os.getenv

另見對應的 C 函式 getenv [18]

Lua 標準函式庫不提供存取 POSIX 定義的 C 函式 setenv,因為它並未定義在 ASCI C 中。

os.remove

另見對應的 C 函式 remove [19]

os.rename

另見對應的 C 函式 rename [20]

os.setlocale

另請參閱對應 C setlocale 函數 [21] 和維基百科:Locale [22]

各項功能及運算會受目前 locale 影響。包括:os.datestring.lowerstring.upper、字串比較,以及模式配對。

os.time

另請參閱對應 C time 函數 [23]

os.tmpname

另請參閱對應 C tmpnam 函數 [24]

5.9 - 編譯除錯函式庫

另請參閱 Beginning Lua Programming 的「第 11 章:探索 Lua 函式庫」或 Programming in Lua, Second Edition 的「第 23 章:除錯函式庫」[4]

debug.getfenv

注意:getfenv 函數與 debug.getfenv 不盡相同。

debug.getlocal

相關注意事項:LuaList:2007-01/msg00214.html

範例:StringInterpolation

debug.getmetatable

此函數類似 getmetatable,但會在取得元資料時忽略 __metatable 元函數。此函數也可以稱為 rawgetmetatable。由於有些物件可能會將 __metatable 元函數設為安全(防止客戶端取得元資料),您可能需要禁止使用 debug.getmetatable

debug.setmetatable

此函數類似 setmetatable,但可以使用於表格以外的物件。您甚至可以使用在 nil 中。

未記載注意事項:此函數會在成功時傳回 true,在失敗時傳回 false,不過目前看來似乎永遠會傳回 true。(請小心:未記載的行為可能在未來修改。)

7 - 與先前版本不相容

另請參閱 MigratingToFiveOneLuaFiveFeatures,以及 LuaFiveAlphaToBeta

8 - Lua 的完整語法

另請參閱 LuaGrammar

更多作者注意事項及使用者留言

我覺得「3. 應用程式介面」章節應該放在比較後面,這樣僅透過 Lua 語言使用 Lua 而非 C 語言(大部分使用者都屬於此類)的人們就不必費心研究它。這是比較進階的主題。--DavidManura

5.1 手冊的備用瀏覽器:我不喜歡 Lua 手冊全部都在同一頁面,所以為自己製作了一個小型瀏覽器/搜尋器,我時常使用它,並想與他人分享:[Luai] --McFin

以上頁面已針對 5.1.3 參考手冊進行檢查。--DavidManura


RecentChanges · preferences
edit · history
最後編輯於 2010 年 11 月 5 日 上午 9:04 GMT (diff)