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
的情况)。至少有两名用户指出参考手册中这一点不清楚。你可以使用带有 "f"
的 lua_getinfo
获取给定堆栈级别上的函数。
隐含地...发生错误时,将错误推送到堆栈并返回错误代码(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 中的“第 9 章:使用协程自然地处理事件”和“第 11 章:探索 Lua 库”,Programming in Lua, Second Edition [4] 中的“第 9 章:协程”,或 CoroutinesTutorial。
另请参见 Beginning Lua Programming 中的“第 7 章:使用模块”和“第 11 章:探索 Lua 库”,Programming in Lua, Second Edition [4] 中的“第 15 章:模块和包”,或 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)。
另见《Lua编程入门》中的“第11章:探索Lua库”和“第11章:探索Lua库”,《Lua编程第二版》中的“第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] 和维基百科:区域设置[22]。
各种函数和操作受当前区域设置的影响。这些包括: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。(注意:未记录的行为在将来可能会发生变化。)
另请参阅 迁移到 5.1、Lua 5.0 功能 和 Lua 5.0 Alpha 到 Beta。
另请参阅 Lua 语法。
我认为“3. 应用程序编程接口”一章最好放在最后,这样那些只通过 Lua 语言而不是 C 语言使用 Lua 的人(包括大多数用户)就不需要过多地关注它。这是一个更高级的主题。--DavidManura
5.1 手册的替代浏览器:我不喜欢 Lua 手册全部在一页上的方式,所以我为自己做了一个小型的浏览器/搜索器,我一直都在使用它,并且想与大家分享:[Luai] --McFin
以上页面已针对 5.1.3 参考手册进行了审查。--DavidManura