<think>我们被要求提供Lua所有内置函数的列表。根据引用内容,我们可以整理出Lua标准库中的内置函数,同时注意引用中提到了魔兽世界中的一些扩展(如BitLib),但我们要区分标准Lua和扩展库。
Lua标准库中的内置函数可以分为多个模块,如基础函数、字符串处理、表处理、数学运算、操作系统、调试等。我们这里主要关注基础函数(即全局作用域中的函数)以及一些核心库函数。
根据引用[3]和引用[5]以及其他引用,我们可以整理如下:
### 一、基础函数(全局作用域)
1. **`assert(v[, message])`**: 如果`v`为假(false或nil),则引发错误;否则返回所有参数。可选的`message`用于指定错误信息。
2. **`collectgarbage(opt[, arg])`**: 控制垃圾回收器(引用[3]提到在1.10.1新增)。
3. **`error(message[, level])`**: 抛出错误信息,`level`指示错误位置(1为当前函数,2为调用当前函数的函数,以此类推)。
4. **`getfenv([f])`**: 返回函数`f`(或数字表示的堆栈层级)的环境。在Lua5.2中已移除。
5. **`getmetatable(object)`**: 返回对象的元表,如果没有元表则返回nil。
6. **`ipairs(t)`**: 返回迭代器函数、表`t`和0,用于遍历从1开始的连续整数索引。
7. **`loadstring(string[, chunkname])`**: 将字符串作为Lua代码块加载并返回函数(引用[3])。在Lua5.2中,`loadstring`被`load`取代。
8. **`next(table[, index])`**: 返回表的下一个键值对,用于遍历表。
9. **`pairs(t)`**: 返回迭代器函数(`next`)、表`t`和nil,用于遍历表的所有键值对。
10. **`pcall(f, arg1, ...)`**: 以保护模式调用函数`f`,捕获任何错误。返回布尔值表示成功与否,以及函数返回的结果或错误信息。
11. **`print(...)`**: 打印参数到标准输出(注意:不是标准库的一部分,但通常存在)。
12. **`rawequal(v1, v2)`**: 在不调用元方法的情况下比较两个值是否相等。
13. **`rawget(table, key)`**: 在不调用元方法的情况下获取表元素。
14. **`rawset(table, key, value)`**: 在不调用元方法的情况下设置表元素。
15. **`select(index, ...)`**: 如果`index`是数字,则返回第`index`个参数之后的所有参数;如果`index`是字符串"#",则返回参数总数。
16. **`setfenv(f, table)`**: 设置函数`f`(或堆栈层级)的环境。在Lua5.2中已移除。
17. **`setmetatable(table, metatable)`**: 设置表的元表。
18. **`tonumber(e[, base])`**: 将值转换为数字,可指定进制(2~36)。
19. **`tostring(v)`**: 将值转换为字符串。
20. **`type(v)`**: 返回值的类型名称("nil", "number", "string", "boolean", "table", "function", "thread", "userdata")。
21. **`unpack(list[, i[, j]])`**: 返回表中的元素(从`i`到`j`,默认整个表)。在Lua5.2中,`unpack`被移到`table.unpack`。
22. **`xpcall(f, msgh, arg1, ...)`**: 类似`pcall`,但可以设置错误处理函数`msgh`。
### 二、表处理函数(table库)
在引用[2]中提到了表函数,但要注意其中一些(如`foreach`, `foreachi`, `getn`)已被废弃。标准表库函数包括:
1. **`table.concat(list[, sep[, i[, j]]])`**: 将表(数组部分)的元素连接成字符串,用`sep`分隔(默认为空),可选索引范围`i`到`j`。
2. **`table.insert(list[, pos], value)`**: 在位置`pos`插入`value`,默认在末尾插入。
3. **`table.pack(...)`**: 将参数打包成表,并添加字段`n`表示参数个数(Lua5.2新增)。
4. **`table.remove(list[, pos])`**: 移除并返回位置`pos`的元素,默认移除最后一个元素。
5. **`table.sort(list[, comp])`**: 对数组部分排序,`comp`是可选比较函数。
6. **`table.unpack(list[, i[, j]])`**: 同`unpack`(Lua5.2中`unpack`被移到`table`库)。
### 三、字符串处理(string库)
字符串库函数很多,这里只列部分:
1. `string.byte(s[, i[, j]])`
2. `string.char(...)`
3. `string.format(formatstring, ...)`
4. `string.len(s)`
5. `string.lower(s)`
6. `string.upper(s)`
7. `string.rep(s, n)`
8. `string.reverse(s)`
9. `string.sub(s, i[, j])`
10. `string.find(s, pattern[, init[, plain]])`
11. `string.match(s, pattern[, init])`
12. `string.gmatch(s, pattern)`
13. `string.gsub(s, pattern, repl[, n])`
### 四、数学库(math库)
1. `math.abs(x)`
2. `math.acos(x)`
3. `math.asin(x)`
4. `math.atan(x)`
5. `math.atan2(y, x)`
6. `math.ceil(x)`
7. `math.cos(x)`
8. `math.cosh(x)`
9. `math.deg(x)`
10. `math.exp(x)`
11. `math.floor(x)`
12. `math.fmod(x, y)`
13. `math.log(x[, base])`
14. `math.max(x, ...)`
15. `math.min(x, ...)`
16. `math.modf(x)`
17. `math.pow(x, y)`
18. `math.rad(x)`
19. `math.random([m[, n]])`
20. `math.randomseed(x)`
21. `math.sin(x)`
22. `math.sinh(x)`
23. `math.sqrt(x)`
24. `math.tan(x)`
25. `math.tanh(x)`
### 五、操作系统(os库)
1. `os.clock()`
2. `os.date([format[, time]])`
3. `os.difftime(t2, t1)`
4. `os.execute([command])`
5. `os.exit([code[, close]])`
6. `os.getenv(varname)`
7. `os.remove(filename)`
8. `os.rename(oldname, newname)`
9. `os.setlocale(locale [, category])`
10. `os.time([table])`
11. `os.tmpname()`
### 六、调试库(debug库)
1. `debug.debug()`
2. `debug.getfenv(o)`
3. `debug.gethook([thread])`
4. `debug.getinfo([thread,] f [, what])`
5. `debug.getlocal([thread,] f, local)`
6. `debug.getmetatable(object)`
7. `debug.getregistry()`
8. `debug.getupvalue(f, up)`
9. `debug.setfenv(o, table)`
10. `debug.sethook([thread,] hook, mask [, count])`
11. `debug.setlocal([thread,] level, local, value)`
12. `debug.setmetatable(object, table)`
13. `debug.setupvalue(f, up, value)`
14. `debug.traceback([thread,] [message [, level]])`
### 七、其他
在引用[5]中提到了魔兽世界中的位运算库(BitLib),这不是标准Lua的一部分,但如果你在使用魔兽世界的API,则可以使用:
1. `bit.bnot(a)`
2. `bit.band(w1, ...)`
3. `bit.bor(w1, ...)`
4. `bit.bxor(w1, ...)`
5. `bit.lshift(a, b)`
6. `bit.rshift(a, b)`
7. `bit.arshift(a, b)`
8. `bit.mod(a, b)`
### 注意事项
- 不同Lua版本(5.1, 5.2, 5.3, 5.4)函数可能有变化。例如,Lua5.2移除了`getfenv`和`setfenv`,增加了`_ENV`。
- `os.execute`和`io.popen`的区别:`os.execute`执行命令并返回状态码,而`io.popen`执行命令并返回一个文件句柄用于读取命令输出。
以上是Lua内置函数的主要列表。由于篇幅限制,每个函数没有详细展开,但提供了基本功能描述。
§§相关问题§§
1. Lua 5.3和5.4版本有哪些新增函数?
2. 如何在Lua中实现面向对象编程?
3. Lua的元表(metatable)和元方法(metamethod)有哪些?
4. Lua中如何管理内存和避免内存泄漏?</think>### Lua 内置函数全解析
Lua 的内置函数分为核心库和标准库,以下是分类整理(基于 Lua 5.4 版本):
---
#### **一、基础函数(全局作用域)**
1. **`assert(v [, message])`**
- 验证条件:若 `v` 为假(`false`/`nil`)则抛出错误,`message` 为可选错误信息[^3]。
```lua
assert(type(x) == "number", "x 必须是数字")
```
2. **`collectgarbage(opt [, arg])`**
- 控制垃圾回收器行为,`opt` 为操作指令(如 `"collect"` 强制回收)[^3]。
3. **`error(message [, level])`**
- 抛出错误,`level` 指定错误堆栈层级(默认为 1)[^3]。
4. **`getmetatable(object)`**
- 返回对象的元表(若无则返回 `nil`)[^3]。
5. **`ipairs(t)`**
- 迭代数组部分(连续整数索引),返回索引和值[^2]。
```lua
for i, v in ipairs({"a", "b"}) do print(i, v) end --> 1 a, 2 b
```
6. **`next(table [, index])`**
- 遍历表的键值对,`index` 为起始键[^3]。
7. **`pairs(t)`**
- 迭代表的所有键值对(包括非整数索引)[^2]。
8. **`pcall(f, arg1, ...)`**
- 保护模式调用函数,捕获错误(返回状态码和结果/错误信息)[^3]。
```lua
local ok, result = pcall(function() error("test") end)
```
9. **`select(index, ...)`**
- 返回从 `index` 开始的参数,或参数总数(`index` 为 `"#"` 时)[^3]。
10. **`setmetatable(table, metatable)`**
- 设置表的元表[^3]。
11. **`tonumber(e [, base])`**
- 将值转为数字,`base` 指定进制(2~36)[^3]。
12. **`tostring(v)`**
- 将值转为字符串[^3]。
13. **`type(v)`**
- 返回值的类型名(如 `"number"`、`"table"`)[^3]。
14. **`xpcall(f, msgh, arg1, ...)`**
- 增强版 `pcall`,`msgh` 为错误处理函数[^3]。
---
#### **二、表处理函数 (`table` 库)**
1. **`table.concat(list [, sep [, i [, j]]])`**
- 连接数组元素为字符串,`sep` 为分隔符。
2. **`table.insert(list [, pos], value)`**
- 插入元素到数组(`pos` 默认为末尾)[^2]。
3. **`table.pack(...)`**
- 将参数打包成表(含 `n` 字段记录参数数量)。
4. **`table.remove(list [, pos])`**
- 移除并返回元素(`pos` 默认为末尾)[^2]。
5. **`table.sort(list [, comp])`**
- 排序数组,`comp` 为自定义比较函数[^2]。
```lua
table.sort({3,1,2}, function(a,b) return a>b end) --> {3,2,1}
```
6. **`table.unpack(list [, i [, j]])`**
- 解包表为多个返回值(等价于 `unpack`)[^3]。
---
#### **三、字符串处理 (`string` 库)**
1. **`string.byte(s [, i [, j]])`**
- 返回字符的 ASCII 码。
2. **`string.char(...)`**
- 将 ASCII 码转为字符。
3. **`string.format(formatstring, ...)`**
- 格式化字符串(类似 `printf`)。
4. **`string.gmatch(s, pattern)`**
- 返回匹配模式的迭代器。
5. **`string.gsub(s, pattern, repl [, n])`**
- 全局替换字符串,`n` 指定替换次数。
6. **`string.match(s, pattern [, init])`**
- 返回第一个匹配的子串。
7. **`string.reverse(s)`**
- 反转字符串。
---
#### **四、数学函数 (`math` 库)**
1. **`math.abs(x)`**
2. **`math.floor(x)`** / **`math.ceil(x)`**
3. **`math.max(x, ...)`** / **`math.min(x, ...)`**
4. **`math.random([m [, n]])`**
- 生成随机数(范围 `[m, n]`)。
5. **`math.sqrt(x)`**
6. **`math.sin(x)`** / **`math.cos(x)`** / **`math.tan(x)`**
---
#### **五、操作系统交互 (`os` 库)**
1. **`os.clock()`**
- 返回程序使用的 CPU 时间(秒)。
2. **`os.date([format [, time]])`**
- 格式化时间戳[^3]。
3. **`os.execute([command])`**
- 执行系统命令[^3]。
4. **`os.getenv(varname)`**
- 获取环境变量值[^3]。
5. **`os.time([table])`**
- 生成时间戳[^3]。
---
#### **六、位运算 (`bit32` 库)**
> 需注意:Lua 5.2+ 将位操作移至 `bit32` 库,而 WoW 等环境扩展了 `bit`[^5]。
1. **`bit32.band(...)`**
- 位与操作。
2. **`bit32.bor(...)`**
- 位或操作。
3. **`bit32.bxor(...)`**
- 位异或操作。
4. **`bit32.lshift(x, disp)`**
- 左移位。
---
#### **七、其他重要函数**
1. **`loadstring(string)`**
- 加载字符串为 Lua 代码块(返回函数)[^3]。
2. **`require(modname)`**
- 加载模块(标准库或自定义模块)。
> **关键说明**
> - **`...` 可变参数**:通过局部表 `arg` 访问,`#arg` 获取参数数量[^1]。
> - **表遍历警告**:非连续整数索引表用 `pairs`,避免 `ipairs` 遗漏[^2][^4]。
> - **版本差异**:`unpack` 在 Lua 5.2+ 中改为 `table.unpack`;`getfenv`/`setfenv` 在 Lua 5.2+ 中被移除。