Lua Reference Manual Comments |
|
在 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 拥有以下标准库”之后,应该列出“协程操作。”
请参阅 GeneralizedPairsAndIpairs,其中提供了一个会调用元方法的重新实现。
请参阅 GeneralizedPairsAndIpairs,其中提供了一个会调用元方法的重新实现。
请参阅 GeneralizedPairsAndIpairs,其中提供了一个会调用元方法的重新实现。
尽管未明确说明,但传递给 select 的负数索引表示相对于 ... 末尾的偏移量。超出范围的索引会引发错误。从 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)
为什么 xpcall 不像 pcall 那样接受函数参数?以下代码由 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);
}
请注意,与标准 xpcall 相比,errfunc 和 func 参数的顺序已更改。Sergey Rozhenko 的以下代码与标准 xpcall 兼容。
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 中的“Chapter 9: Handling Events Naturally with Coroutines”和“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 9: Coroutines”,或 CoroutinesTutorial。
另请参阅 Beginning Lua Programming 中的“Chapter 7: Using Modules”和“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 15: Modules and Packages”,或 ModulesTutorial。
gmatch 和 gsub 中的 g 显然代表“global”(全局),意味着会处理所有匹配项,而不仅仅是第一个(Beginning Lua Programming,p.186)。它可能受到 Perl 的 /g“global match”(全局匹配)修饰符的启发 [5]。
gsub 这个名称是从 AWK 沿用下来的,早在 Lua 2.5 时期。--lhf
另请参阅 Beginning Lua Programming 中的“Chapter 5: Using Strings”和“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 20: The String Library”,或 LuaTypesTutorial + StringsTutorial + StringLibraryTutorial。
Beginning Lua Programming(p.302)指出 string.dump 有一个未文档说明的(可能随时更改的)行为:“可以转储带有 upvalues 的函数,但在转储版本中,所有 upvalues 都将对该函数私有(即使原始函数与其他函数共享它们),并且在函数内部赋值之前它们将是 nil。(在 Lua 5.0 中,如果给定一个带有 upvalues 的函数,string.dump 会触发错误。)”
另请参阅 Beginning Lua Programming 中的“Chapter 4: Working with Tables”和“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 19: The Table Library”,或 TableLibraryTutorial。
另请参阅 Beginning Lua Programming 中的“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 18: The Mathematical Library”,或 MathLibraryTutorial。
另请参阅 Beginning Lua Programming 中的“Chapter 5: Using Strings”和“Chapter 11: Exploring Lua's Libraries”,或 Programming in Lua, Second Edition [4] 中的“Chapter 21: The I/O Library”。
另请参阅对应的 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 中的“Chapter 11: Exploring Lua's Libraries”(重复)和“Chapter 11: Exploring Lua's Libraries”,Programming in Lua, Second Edition [4] 中的“Chapter 22: The Operating System Library”,以及 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] 和 Wikipedia:Locale [22]。
各种函数和操作受当前区域设置的影响。这些包括:os.date、string.lower、string.upper、字符串比较和模式匹配。
另请参阅对应的 C time 函数 [23]。
另请参阅对应的 C tmpnam 函数 [24]。
另请参阅 Beginning Lua Programming 中的“Chapter 11: Exploring Lua's Libraries”或 Programming in Lua, Second Edition [4] 中的“Chapter 23: The Debug Library”。
注意:getfenv 函数与 debug.getfenv 不完全相同。
相关备注:LuaList:2007-01/msg00214.html。
此函数类似于 getmetatable,不同之处在于它在检索元表时会忽略 __metatable 元方法。此函数可以替代地称为 rawgetmetatable。由于某些对象可能设置了 __metatable 元方法以防止客户端访问元表(出于安全考虑),您可能希望阻止访问 debug.getmetatable。
此函数类似于 setmetatable,但它可以作用于表以外的对象。您甚至可以将其用于 nil。
未文档说明的注意事项: 该函数在成功时返回 true,在失败时返回 false,尽管目前似乎总是返回 true。(注意:未文档说明的行为在将来可能会更改。)
另请参阅 MigratingToFiveOne、LuaFiveFeatures 和 LuaFiveAlphaToBeta。
另请参阅 LuaGrammar。
我认为“3. The Application Program Interface”一章最好放在后面,这样那些仅通过 Lua 语言而不是 C 使用 Lua 的人(这包括大多数用户)就不必过多地关注它了。这是一个更高级的主题。--DavidManura
5.1 手册的替代浏览器:我不喜欢 Lua 手册全部都在一页上的方式,因此我为自己制作了一个小浏览器/搜索器,我一直都在使用它,并且想与他人分享:[Luai] --McFin
以上页面已对照 5.1.3 参考手册进行了审查。--DavidManura