Lua 参考手册注释

lua-users home
wiki

此页面包含对 Lua 参考手册 [1](除非另有说明,否则为版本 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 的情况)。至少有两名用户指出参考手册中这一点不清楚。你可以使用带有 "f"lua_getinfo 获取给定堆栈级别上的函数。

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 具有以下标准库”之后,应该列出“协程操作”。

5.1 - 基本函数

ipairs

有关调用元方法的重新实现,请参见 GeneralizedPairsAndIpairs

next

有关调用元方法的重新实现,请参见 GeneralizedPairsAndIpairs

pairs

有关调用元方法的重新实现,请参见 GeneralizedPairsAndIpairs

select

虽然没有说明,但传递给 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

为什么 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);
}

5.2 - 协程操作

另请参见 Beginning Lua Programming 中的“第 9 章:使用协程自然地处理事件”和“第 11 章:探索 Lua 库”,Programming in Lua, Second Edition [4] 中的“第 9 章:协程”,或 CoroutinesTutorial

5.3 - 模块

另请参见 Beginning Lua Programming 中的“第 7 章:使用模块”和“第 11 章:探索 Lua 库”,Programming in Lua, Second Edition [4] 中的“第 15 章:模块和包”,或 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 - 操作系统设施

另见《Lua编程入门》中的“第11章:探索Lua库”和“第11章:探索Lua库”,《Lua编程第二版》中的“第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] 和维基百科:区域设置[22]

各种函数和操作受当前区域设置的影响。这些包括: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

示例:字符串插值

debug.getmetatable

此函数类似于 getmetatable,但它在检索元表时会忽略 __metatable 元方法。此函数可以称为 rawgetmetatable。由于某些对象可能出于安全原因设置了 __metatable 元方法(以防止客户端访问元表),因此您可能希望阻止访问 debug.getmetatable

debug.setmetatable

此函数类似于 setmetatable,但它可以作用于除表以外的其他对象。您甚至可以将其用于 nil

未记录的说明:该函数在成功时返回 true,在失败时返回 false,尽管目前似乎总是返回 true。(注意:未记录的行为在将来可能会发生变化。)

7 - 与先前版本的兼容性

另请参阅 迁移到 5.1Lua 5.0 功能Lua 5.0 Alpha 到 Beta

8 - Lua 的完整语法

另请参阅 Lua 语法

其他作者说明和用户评论

我认为“3. 应用程序编程接口”一章最好放在最后,这样那些只通过 Lua 语言而不是 C 语言使用 Lua 的人(包括大多数用户)就不需要过多地关注它。这是一个更高级的主题。--DavidManura

5.1 手册的替代浏览器:我不喜欢 Lua 手册全部在一页上的方式,所以我为自己做了一个小型的浏览器/搜索器,我一直都在使用它,并且想与大家分享:[Luai] --McFin

以上页面已针对 5.1.3 参考手册进行了审查。--DavidManura


最近更改 · 偏好设置
编辑 · 历史
最后编辑于 2010 年 11 月 5 日上午 9:04 GMT (差异)